<?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=F-morozov</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=F-morozov"/>
	<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/F-morozov"/>
	<updated>2026-10-23T00:56:31Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%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_(4)&amp;diff=19890</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=19890"/>
		<updated>2016-12-02T15:28:47Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&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 \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Исследование проводилось на узлах раздела test суперкомпьютера &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lomonosov&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация QR-алгоритма из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Была написана программа на языке C, использовался компилятор [https://software.intel.com/en-us/c-compilers Intel C++]. Пример компиляции программы и запуска для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt;:&lt;br /&gt;
  $ mpicc qr.c -o _scratch/qr -L${MKLROOT}/lib/intel64 -lmkl_rt -lpthread -lm -ldl&lt;br /&gt;
  $ sbatch -n 1 -p test run _scratch/qr 8000&lt;br /&gt;
&lt;br /&gt;
Оценивалось время вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). Ввиду того, что количество операций зависит от числа итераций алгоритма, оценить [[Глоссарий#Производительность|производительность]] не удается.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число потоков [1 : 8];&lt;br /&gt;
*	размер матрицы [2000 : 8000] с шагом 500.&lt;br /&gt;
&lt;br /&gt;
На рисунке приведен график времени работы выбранной реализации QR-алгоритма в зависимости от изменяемых параметров запуска. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется. Время выполнения в зависимости от размера задачи растет значительно быстрее при использовании одного потока по сравнению с использованиемм нескольких потоков. Увеличение числа потоков при фиксированном размере задачи приводит к уменьшению времени выполнения. Для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt; время работы однопоточной реализации более чем в два раза превосходит время работы параллельной.&lt;br /&gt;
&lt;br /&gt;
Исходный код программы на языке C и скрипт для обработки результатов доступны на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=18781</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=18781"/>
		<updated>2016-11-21T11:44:33Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&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;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Исследование проводилось на узлах раздела test суперкомпьютера &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lomonosov&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация QR-алгоритма из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Была написана программа на языке C, использовался компилятор [https://software.intel.com/en-us/c-compilers Intel C++]. Пример компиляции программы и запуска для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt;:&lt;br /&gt;
  $ mpicc qr.c -o _scratch/qr -L${MKLROOT}/lib/intel64 -lmkl_rt -lpthread -lm -ldl&lt;br /&gt;
  $ sbatch -n 1 -p test run _scratch/qr 8000&lt;br /&gt;
&lt;br /&gt;
Оценивалось время вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). Ввиду того, что количество операций зависит от числа итераций алгоритма, оценить [[Глоссарий#Производительность|производительность]] не удается.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число потоков [1 : 8];&lt;br /&gt;
*	размер матрицы [2000 : 8000] с шагом 500.&lt;br /&gt;
&lt;br /&gt;
На рисунке приведен график времени работы выбранной реализации QR-алгоритма в зависимости от изменяемых параметров запуска. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется. Время выполнения в зависимости от размера задачи растет значительно быстрее при использовании одного потока по сравнению с использованиемм нескольких потоков. Увеличение числа потоков при фиксированном размере задачи приводит к уменьшению времени выполнения. Для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt; время работы однопоточной реализации более чем в два раза превосходит время работы параллельной.&lt;br /&gt;
&lt;br /&gt;
Исходный код программы на языке C и скрипт для обработки результатов доступны на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=18779</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=18779"/>
		<updated>2016-11-21T11:43:44Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&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;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Исследование проводилось на узлах test суперкомпьютера &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lomonosov&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация QR-алгоритма из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Была написана программа на языке C, использовался компилятор [https://software.intel.com/en-us/c-compilers Intel C++]. Пример компиляции программы и запуска для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt;:&lt;br /&gt;
  $ mpicc qr.c -o _scratch/qr -L${MKLROOT}/lib/intel64 -lmkl_rt -lpthread -lm -ldl&lt;br /&gt;
  $ sbatch -n 1 -p test run _scratch/qr 8000&lt;br /&gt;
&lt;br /&gt;
Оценивалось время вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). Ввиду того, что количество операций зависит от числа итераций алгоритма, оценить [[Глоссарий#Производительность|производительность]] не удается.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число потоков [1 : 8];&lt;br /&gt;
*	размер матрицы [2000 : 8000] с шагом 500.&lt;br /&gt;
&lt;br /&gt;
На рисунке приведен график времени работы выбранной реализации QR-алгоритма в зависимости от изменяемых параметров запуска. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется. Время выполнения в зависимости от размера задачи растет значительно быстрее при использовании одного потока по сравнению с использованиемм нескольких потоков. Увеличение числа потоков при фиксированном размере задачи приводит к уменьшению времени выполнения. Для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt; время работы однопоточной реализации более чем в два раза превосходит время работы параллельной.&lt;br /&gt;
&lt;br /&gt;
Исходный код программы на языке C и скрипт для обработки результатов доступны на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=18778</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=18778"/>
		<updated>2016-11-21T11:42:21Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&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;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Исследование проводилось на узлах test суперкомпьютера &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lomonosov&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация QR-алгоритма из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Была написана программа на языке C, использовался компилятор [https://software.intel.com/en-us/c-compilers Intel C++]. Пример компиляции и запуска программы:&lt;br /&gt;
  $ mpicc qr.c -o _scratch/qr -L${MKLROOT}/lib/intel64 -lmkl_rt -lpthread -lm -ldl&lt;br /&gt;
  $ sbatch -n 1 -p test run _scratch/qr 8000&lt;br /&gt;
&lt;br /&gt;
Оценивалось время вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). Ввиду того, что количество операций зависит от числа итераций алгоритма, оценить [[Глоссарий#Производительность|производительность]] не удается.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число потоков [1 : 8];&lt;br /&gt;
*	размер матрицы [2000 : 8000] с шагом 500.&lt;br /&gt;
&lt;br /&gt;
На рисунке приведен график времени работы выбранной реализации QR-алгоритма в зависимости от изменяемых параметров запуска. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется. Время выполнения в зависимости от размера задачи растет значительно быстрее при использовании одного потока по сравнению с использованиемм нескольких потоков. Увеличение числа потоков при фиксированном размере задачи приводит к уменьшению времени выполнения. Для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt; время работы однопоточной реализации более чем в два раза превосходит время работы параллельной.&lt;br /&gt;
&lt;br /&gt;
Исходный код программы на языке C и скрипт для обработки результатов доступны на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=18344</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=18344"/>
		<updated>2016-11-18T20:55:51Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &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;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lomonosov&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация QR-алгоритма из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Была написана программа на языке C, использовался компилятор [https://software.intel.com/en-us/c-compilers Intel C++]. Оценивалось время вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads) на узле раздела test суперкомпьютера. Ввиду того, что количество операций зависит от числа итераций алгоритма, оценить [[Глоссарий#Производительность|производительность]] не удается.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число потоков [1 : 8];&lt;br /&gt;
*	размер матрицы [2000 : 8000] с шагом 500.&lt;br /&gt;
&lt;br /&gt;
На рисунке приведен график времени работы выбранной реализации QR-алгоритма в зависимости от изменяемых параметров запуска. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется. Время выполнения в зависимости от размера задачи растет значительно быстрее при использовании одного потока по сравнению с использованиемм нескольких потоков. Увеличение числа потоков при фиксированном размере задачи приводит к уменьшению времени выполнения. Для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt; время работы однопоточной реализации более чем в два раза превосходит время работы параллельной.&lt;br /&gt;
&lt;br /&gt;
Исходный код программы на языке C и скрипт для обработки результатов доступны на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=18341</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=18341"/>
		<updated>2016-11-18T20:54:50Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&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;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lomonosov&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Исследовалась реализация QR-алгоритма из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Была написана программа на языке C, использовался компилятор [https://software.intel.com/en-us/c-compilers Intel C++]. Оценивалось время вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads) на узле раздела test суперкомпьютера. Ввиду того, что количество операций зависит от числа итераций алгоритма, оценить [[Глоссарий#Производительность|производительность]] не удается.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых [[Глоссарий#Параметры запуска|параметров запуска]] реализации алгоритма: &lt;br /&gt;
&lt;br /&gt;
*	число потоков [1 : 8];&lt;br /&gt;
*	размер матрицы [2000 : 8000] с шагом 500.&lt;br /&gt;
&lt;br /&gt;
На рисунке приведен график времени работы выбранной реализации QR-алгоритма в зависимости от изменяемых параметров запуска. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Из рисунка видно, что алгоритм хорошо масштабируется. Время выполнения в зависимости от размера задачи растет значительно быстрее при использовании одного потока по сравнению с использованиемм нескольких потоков. Увеличение числа потоков при фиксированном размере задачи приводит к уменьшению времени выполнения. Для матрицы размера &amp;lt;math&amp;gt;8000 \times 8000&amp;lt;/math&amp;gt; время работы однопоточной реализации более чем в два раза превосходит время работы параллельной.&lt;br /&gt;
&lt;br /&gt;
Исходный код программы на языке C и скрипт для обработки результатов доступны на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=18235</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=18235"/>
		<updated>2016-11-18T18:46:09Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&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;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы на языке C доступен на [https://github.com/f-morozov/algowiki-qr github], там же находится скрипт для обработки результатов. Исследовалась реализация QR-алгоритма из бибилиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] версии 11.2.0 (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17472</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17472"/>
		<updated>2016-11-15T21:02:28Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение);&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обобщенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17456</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17456"/>
		<updated>2016-11-15T20:51:19Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Уменьшение числа итераций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;(A - sI)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17449</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17449"/>
		<updated>2016-11-15T20:46:25Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Уменьшение числа итераций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для увеличения скорости сходимости алгоритма можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;A - sI&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17444</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17444"/>
		<updated>2016-11-15T20:43:04Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Улучшение сходимости */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Уменьшение числа итераций ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для решения этой проблемы можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;A - sI&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17442</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17442"/>
		<updated>2016-11-15T20:41:09Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Улучшение сходимости ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для решения этой проблемы можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;A - sI&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17441</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17441"/>
		<updated>2016-11-15T20:40:55Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3 + N \times O(n^2))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Улучшение сходимости ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для решения этой проблемы можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;A - sI&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17440</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17440"/>
		<updated>2016-11-15T20:40:10Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N \times O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Улучшение сходимости ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для решения этой проблемы можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;A - sI&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (Matrix size) и числа потоков (Threads). &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* ?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (Fortran, C). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* p?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* p?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
#[http://www-03.ibm.com/systems/power/software/essl/ IBM ESSL] (Fortran, C, C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17432</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17432"/>
		<updated>2016-11-15T20:27:29Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N \times O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Улучшение сходимости ===&lt;br /&gt;
&lt;br /&gt;
Скорость сходимости алгоритма зависит от отношения модулей собственных значений: чем больше отношение &amp;lt;math&amp;gt;|\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;, тем медленнее убывает поддиагональный &amp;lt;math&amp;gt;(n-m) \times m &amp;lt;/math&amp;gt; блок.&lt;br /&gt;
Для решения этой проблемы можно перейти от матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице &amp;lt;math&amp;gt;A - sI&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;s \in \mathbb{C}&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt; — единичная матрица, в надежде, что &amp;lt;math&amp;gt;|\lambda_{m+1} - s| / |\lambda_m - s| \ll |\lambda_{m+1}| / |\lambda_m|&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Такой подход называется QR-алгоритмом со сдвигами и имеет следуюший вид:&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} - s_kI= Q_kR_k&amp;lt;/math&amp;gt; (QR-разложение)&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k + s_kI&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами является частным случаем обощенного QR-алгоритма (QR-алгоритма с мультисдвигами), в котором на каждой итерации используется полином &amp;lt;math&amp;gt;f_k&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;f_k(A_{k-1}) = Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф.]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных порядков матрицы и числа потоков. &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17406</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17406"/>
		<updated>2016-11-15T20:00:03Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N \times O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной матрицы для различных значений размера матрицы и числа потоков. &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17399</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17399"/>
		<updated>2016-11-15T19:57:15Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N \times O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной матрицы для различных значений размера матрицы и числа потоков. &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;]. Исходный код программы доступен на [https://github.com/f-morozov/algowiki-qr github].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17054</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17054"/>
		<updated>2016-11-14T15:37:17Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N \times O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
Для исследования масштабируемости алгоритма использовалась его реализация из библиотеки [https://software.intel.com/en-us/node/521079 Intel MKL] (функции LAPACKE_sgehrd и LAPACKE_shseqr). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной матрицы для различных значений размера матрицы и числа потоков. &lt;br /&gt;
&lt;br /&gt;
Для запуска использовался [https://parallel.ru/cluster/superinfo суперкомпьютер &amp;quot;Ломоносов&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=17048</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=17048"/>
		<updated>2016-11-14T15:23:20Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N \times O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=16922</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=16922"/>
		<updated>2016-11-14T10:49:45Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность 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;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=16892</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=16892"/>
		<updated>2016-11-14T10:30:37Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
[[Файл:Qr_algorithm_lapack.png|thumb|center|700px|Рисунок 2.]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=16888</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=16888"/>
		<updated>2016-11-14T10:26:27Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(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;
[[Файл:Qr_algorithm_lapack.png]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15679</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15679"/>
		<updated>2016-11-01T20:59:29Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15673</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15673"/>
		<updated>2016-11-01T20:55:41Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    #Собственными значениями являются диагональные элементы полученной матрицы&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15669</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15669"/>
		<updated>2016-11-01T20:53:29Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR-разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    return diagonal_items(A) #Собственные значения находятся на диагонали полученной матрицы&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15665</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15665"/>
		<updated>2016-11-01T20:51:16Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    return diagonal_items(A) #Собственные значения находятся на диагонали полученной матрицы&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15662</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15662"/>
		<updated>2016-11-01T20:49:20Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы методом QR разложения&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица A приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A): #Является ли матрица A верхней треугольной&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы A&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    return diagonal_items(A) #Собственные значения находятся на диагонали матрицы A&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15653</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15653"/>
		<updated>2016-11-01T20:35:33Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке Python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A, use_hessenberg_form):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вычисление собственных значений матрицы&lt;br /&gt;
&lt;br /&gt;
    Параметры:&lt;br /&gt;
    A -- квадратная матрица&lt;br /&gt;
    use_hessenberg_form -- использовать ли приведение к хессенберговой форме&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A) #Матрица приводится к хессенберговой форме&lt;br /&gt;
    while not is_upper_triangular(A):&lt;br /&gt;
        Q, R = QR_decomposition(A) #Производится QR-разложение матрицы&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    return diagonal_items(A) #Собственные значения находятся на диагонали матрицы&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15606</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15606"/>
		<updated>2016-11-01T15:42:51Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
Пример реализации на языке python:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def get_eigenvalues(A):&lt;br /&gt;
    if use_hessenberg_form:&lt;br /&gt;
        A = to_hessenberg_form(A)&lt;br /&gt;
    while not is_upper_triangular(A):&lt;br /&gt;
        Q, R = QR_decomposition(A)&lt;br /&gt;
        A = R * Q&lt;br /&gt;
    return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15603</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15603"/>
		<updated>2016-11-01T15:41:01Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
Описание составлено совместно, точно выделить вклад отдельных авторов невозможно.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15602</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15602"/>
		<updated>2016-11-01T15:38:13Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15601</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15601"/>
		<updated>2016-11-01T15:37:16Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — размер матрицы, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=15600</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=15600"/>
		<updated>2016-11-01T15:37:03Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма: &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — размер матрицы, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; — число итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov&amp;diff=13292</id>
		<title>Участник:F-morozov</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:F-morozov&amp;diff=13292"/>
		<updated>2016-10-20T21:19:52Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Студент магистратуры ВМК МГУ, 620 группа.&lt;br /&gt;
[mailto:f-morozov@ya.ru f-morozov@ya.ru]&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=12008</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=12008"/>
		<updated>2016-10-15T20:54:11Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: &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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=12001</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=12001"/>
		<updated>2016-10-15T20:53:00Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Существующие реализации алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11996</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11996"/>
		<updated>2016-10-15T20:52:35Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Существующие реализации алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная), имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]:&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная), Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]:&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK.&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++).&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11960</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11960"/>
		<updated>2016-10-15T20:48:31Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Последовательная сложность алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&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;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11951</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11951"/>
		<updated>2016-10-15T20:47:30Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Последовательная сложность алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-итерация для хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11925</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11925"/>
		<updated>2016-10-15T20:45:05Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Ресурс параллелизма алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно:&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]];&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11920</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11920"/>
		<updated>2016-10-15T20:44:27Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Последовательная сложность алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим сложность отдельных элементов алгоритма:&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций;&lt;br /&gt;
* сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхней треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11892</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11892"/>
		<updated>2016-10-15T20:42:20Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Макроструктура алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
* (опционально) приведение к хессенберговой форме;&lt;br /&gt;
* QR-разложение;&lt;br /&gt;
* умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11886</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11886"/>
		<updated>2016-10-15T20:41:50Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Макроструктура алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (опционально) приведение к хессенберговой форме;&lt;br /&gt;
# QR-разложение;&lt;br /&gt;
# умножение плотных матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11836</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11836"/>
		<updated>2016-10-15T20:35:43Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Информационный граф */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Рисунок 1. Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11817</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11817"/>
		<updated>2016-10-15T20:32:54Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, чем ближе по модулю собственные значения, тем медленее скорость сходимости. Для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11806</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11806"/>
		<updated>2016-10-15T20:31:08Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма зависит от отношения собственных значений, для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11802</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11802"/>
		<updated>2016-10-15T20:30:34Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, то есть алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма завивит отношения собственных значений, для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11795</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11795"/>
		<updated>2016-10-15T20:29:21Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, значит алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма завивит отношения собственных значений, для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* Если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; эрмитова, то хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11790</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11790"/>
		<updated>2016-10-15T20:27:39Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение;&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц;&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Число итераций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; заранее неизвестно, значит алгоритм недетерминирован.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* Скорость сходимости алгоритма завивит отношения собственных значений, для решения данной проблемы используется QR-алгоритм со сдвигами.&lt;br /&gt;
* В случае эрмитовой матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</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:F-morozov/%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_(4)&amp;diff=11662</id>
		<title>Участник:F-morozov/Нахождение собственных чисел квадратной матрицы методом QR разложения (4)</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:F-morozov/%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_(4)&amp;diff=11662"/>
		<updated>2016-10-15T20:09:12Z</updated>

		<summary type="html">&lt;p&gt;F-morozov: /* Свойства алгоритма */&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 \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N \times 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;
Основные авторы описания: [[Участник:f-morozov|Ф.&amp;amp;nbsp;В.&amp;amp;nbsp;Морозов]], [[Участник:Nataliya|Н.&amp;amp;nbsp;Ф.&amp;amp;nbsp;Пащенко]]&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для решения ряда задач механики, физики, химии требуется получение всех собственных значений (собственных чисел), а иногда и всех собственных векторов некоторых матриц. Эту задачу называют полной проблемой собственных значений&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;&amp;gt;Бахвалов&amp;amp;nbsp;Н.&amp;amp;nbsp;С.,  Жидков&amp;amp;nbsp;Н.&amp;amp;nbsp;П., Кобельков&amp;amp;nbsp;Г.&amp;amp;nbsp;М. Численные методы. — 6-е изд. — М.: БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&amp;gt;. Если рассматриваются матрицы общего вида, порядок которых не больше тысячи (нескольких тысяч), то для вычисления всех собственных значений (и собственных векторов) можно рекомендовать &#039;&#039;&#039;QR-алгоритм&#039;&#039;&#039;. Он был разработан в начале 1960-х годов независимо В.&amp;amp;nbsp;Н.&amp;amp;nbsp;Кублановской (Россия) и Дж.&amp;amp;nbsp;Фрэнсисом (Великобритания)&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;&amp;gt;Тыртышников&amp;amp;nbsp;Е.&amp;amp;nbsp;Е. Методы численного анализа. — М.: Академия, 2007. — 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нахождение собственных чисел матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; методом QR-разложения (QR-алгоритм) заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; данной последовательности строятся с использованием QR-разложения таким образом, что они подобны между собой и подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, поэтому их собственные значения равны. Характеристический многочлен клеточной правой треугольной матрицы равен произведению характеристических многочленов ее диагональных клеток&amp;lt;ref name=&amp;quot;Бахвалов&amp;quot;/&amp;gt;. Его корни — собственные значения матрицы, которые согласно вышесказанному и являются искомыми.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Известно, что произвольная квадратная матрица может быть представлена в виде произведения унитарной (&#039;&#039;в вещественном случае ортогональной&#039;&#039;) и верхней треугольной матриц. Такое разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм ===&lt;br /&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;k = 1, 2, \ldots&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k-1} = Q_kR_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — унитарная (&#039;&#039;ортогональная&#039;&#039;) матрица, &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица;&lt;br /&gt;
* &amp;lt;math&amp;gt;A_k = R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_k = R_kQ_k = Q_k^{-1}A_{k-1}Q_k&amp;lt;/math&amp;gt;, то есть матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k-1}&amp;lt;/math&amp;gt; подобны для любого &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, матрицы &amp;lt;math&amp;gt;A_1, A_2, \ldots&amp;lt;/math&amp;gt; подобны исходной матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют те же собственные значения.&lt;br /&gt;
При выполнении [[#Сходимость QR-алгоритма|некоторых условий]] последовательность &amp;lt;math&amp;gt;\{A_k\}&amp;lt;/math&amp;gt; сходится к верхней треугольной матрице &amp;lt;math&amp;gt;\hat{A}&amp;lt;/math&amp;gt;, на диагонали которой расположены искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Сходимость QR-алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Сходимость QR-алгоритма трактуется как сходимость к нулю поддиагонального блока матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим, что для матрицы &amp;lt;math&amp;gt;A \in \mathbb{C}^{n \times n}&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt;A = X \Lambda X^{-1}, \quad \Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}, \quad \Lambda_1 \in \mathbb{C}^{m \times m}, \quad \Lambda_2 \in \mathbb{C}^{r \times r}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt;\left | \lambda_1  \right | \ge \ldots \ge \left | \lambda_m  \right | &amp;gt; \left | \lambda_{m+1} \right | \ge \ldots \ge  \left | \lambda_{m+r} \right | &amp;gt; 0, \quad \{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1), \quad \{ \lambda_{m+1}, \ldots, \lambda_{m+r} \} = \lambda(\Lambda_2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
# ведущая подматрица порядка &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;
И пусть QR-алгоритм порождает последовательность матриц&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;A_k = \begin{bmatrix}A_{11}^{(k)} &amp;amp; A_{12}^{(k)} \\ A_{21}^{(k)} &amp;amp; A_{22}^{(k)}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A_{21}^{(k)} \rightarrow O&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k \rightarrow \infty&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если блок &amp;lt;math&amp;gt;A_{21}^{(k)}&amp;lt;/math&amp;gt; достаточно мал, то он заменяется нулевым, и собственные значения ищутся для диагональных блоков &amp;lt;math&amp;gt;A_{11}^{(k)}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{22}^{(k)}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Если условия 1-3 выполнены для всех &amp;lt;math&amp;gt;1 \le m \le 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&amp;lt;/math&amp;gt; сходятся к искомым собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сокращение затрат на одну итерацию ===&lt;br /&gt;
&lt;br /&gt;
Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). &lt;br /&gt;
Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой (почти треугольной) матрице:&lt;br /&gt;
* &amp;lt;math&amp;gt;H = (h_{ij}), \quad h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — произведение конечного числа отражений (или вращений). &lt;br /&gt;
Затем QR-алгоритм применяется к матрице &amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;. Приведение к хессенберговой форме требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций, но после него любая QR-итерация будет выполняться за &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Сокращение затрат на одну итерацию объясняется инвариантностью хессенберговой формы по отношению к QR-итерациям&amp;lt;ref name=&amp;quot;Тыртышников&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на вычисление QR-разложения на итерациях алгоритма. &lt;br /&gt;
&lt;br /&gt;
Для получения QR-разложения могут использоваться [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]], [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метод Гивенса]] или процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
При использовании хессенберговой формы приведение к ней имеет сложность, сравнимую с последующими итерациями QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# (Опционально) Приведение к хессенберговой форме&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
if use_hessenberg_form:&lt;br /&gt;
    A = to_hessenberg_form(A)&lt;br /&gt;
while not is_upper_triangular(A):&lt;br /&gt;
    Q, R = QR_decomposition(A)&lt;br /&gt;
    A = R * Q&lt;br /&gt;
return diagonal_items(A)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение имеет сложность &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* Сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. &lt;br /&gt;
* Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
Сложность построения хессенберговой формы составляет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;, QR-разложение хессенберговой матрицы имеет сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Общая сложность QR-алгоритма с предварительным приведением матрицы к хессенберговой форме равна &amp;lt;math&amp;gt;O(n^3 + N \times n^2)&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;
[[Файл:qr_algorithm_graph.png|thumb|center|640px|Информационный граф]]&lt;br /&gt;
Узлы графа:&lt;br /&gt;
* &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt; — QR-разложение&lt;br /&gt;
* &amp;lt;math&amp;gt;\times&amp;lt;/math&amp;gt; — перемножение матриц&lt;br /&gt;
* &amp;lt;math&amp;gt;isUT&amp;lt;/math&amp;gt; — проверка, является ли матрица верхней треугольной&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что QR-алгоритм является последовательным, действия, выполняемые на каждой итерации, могут быть эффективно выполнены параллельно.&lt;br /&gt;
* Параллельная сложность QR-разложения составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при использовании [[Метод_Гивенса_(вращений)_QR-разложения_матрицы|метода Гивенса]] или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании [[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метода Хаусхолдера]].&lt;br /&gt;
* Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Для проверки, является ли матрица верхней треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;N \times O(n)&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;N \times O(n^2)&amp;lt;/math&amp;gt; в зависимости от используемого метода QR-разложения.&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы, сложность QR-алгоритма составляет &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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности является квадратичным или линейным в зависимости от метода QR-разложения.&lt;br /&gt;
* [[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&gt;
* Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
* В случае эрмитовой матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; хессенбергова матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; будет трехдиагональной, и сложность одной QR-итерации составит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
#[http://www.netlib.org/lapack/ LAPACK] (последовательная). Имеется [https://software.intel.com/en-us/node/521079 реализация в Intel MKL]&lt;br /&gt;
#* ?geev - нахождение собственных значений матрицы;&lt;br /&gt;
#* p?gehrd - приведение к хессенберговой форме;&lt;br /&gt;
#* p?lahqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://www.netlib.org/scalapack/ ScaLAPACK] (параллельная). Имеется [https://software.intel.com/en-us/node/521526 реализация в Intel MKL]&lt;br /&gt;
#* ?gehrd- приведение к хессенберговой форме;&lt;br /&gt;
#* ?hseqr - нахождение собственных значений матрицы в хессенберговой форме.&lt;br /&gt;
#[http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html numpy.linalg.eigvals] (Python) - использует ?geev из LAPACK&lt;br /&gt;
#[http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigen] (C++)&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>F-morozov</name></author>
	</entry>
</feed>