<?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=Nataliya</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=Nataliya"/>
	<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/Nataliya"/>
	<updated>2026-10-22T20:43:07Z</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=19213</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=19213"/>
		<updated>2016-11-26T11:37:44Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: &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;
Исследование проводилось на узлах раздела 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>Nataliya</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=18276</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=18276"/>
		<updated>2016-11-18T19:58:11Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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;Lom&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;
Исходный код программы на языке 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>Nataliya</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=18240</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=18240"/>
		<updated>2016-11-18T18:53:21Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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;Lom&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). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (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_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&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>Nataliya</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=18238</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=18238"/>
		<updated>2016-11-18T18:53:00Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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;Lom&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). Оценивалась производительность QR-алгоритма для вычисления собственных чисел произвольной квадратной матрицы для различных значений порядка матрицы (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_algorithm_lapack.png|thumb|center|700px|Рисунок 2. Производительность QR-алгоритма.]]&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>Nataliya</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=18237</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=18237"/>
		<updated>2016-11-18T18:51:13Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&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-алгоритма из бибилиотеки [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;
Исходный код программы на языке 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>Nataliya</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=17461</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=17461"/>
		<updated>2016-11-15T20:53:24Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Уменьшение числа итераций */&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>Nataliya</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=17458</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=17458"/>
		<updated>2016-11-15T20:51:42Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Уменьшение числа итераций */&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>Nataliya</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=17438</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=17438"/>
		<updated>2016-11-15T20:32:55Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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] (последовательная), имеется [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>Nataliya</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=17437</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=17437"/>
		<updated>2016-11-15T20:30:52Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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] (последовательная), имеется [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>Nataliya</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=17428</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=17428"/>
		<updated>2016-11-15T20:24:00Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Масштабируемость алгоритма и его реализации */&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>Nataliya</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=17424</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=17424"/>
		<updated>2016-11-15T20:20:29Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Информационный граф */&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>Nataliya</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=15622</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=15622"/>
		<updated>2016-11-01T18:27:38Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Схема реализации последовательного алгоритма */&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):&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>Nataliya</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=15621</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=15621"/>
		<updated>2016-11-01T18:26:00Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: &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):&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>Nataliya</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=12057</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=12057"/>
		<updated>2016-10-15T20:58:25Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Ресурс параллелизма алгоритма */&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>Nataliya</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=12000</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=12000"/>
		<updated>2016-10-15T20:52:59Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Ресурс параллелизма алгоритма */&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>Nataliya</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=11902</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=11902"/>
		<updated>2016-10-15T20:43:03Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Последовательная сложность алгоритма */&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>Nataliya</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=11742</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=11742"/>
		<updated>2016-10-15T20:18:55Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Информационный граф */&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;
* Если рассмотренные в разделе «[[#Сходимость 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>Nataliya</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=11712</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=11712"/>
		<updated>2016-10-15T20:14:02Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сокращение затрат на одну итерацию */&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;
* Если рассмотренные в разделе «[[#Сходимость 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>Nataliya</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=11651</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=11651"/>
		<updated>2016-10-15T20:07:07Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Ресурс параллелизма алгоритма */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Для проверки, является ли матрица верхне-треугольной, необходимо &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; операций. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;N \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;
[[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма является линейной, но зависит от числа итераций алгоритма.&lt;br /&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;
&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>Nataliya</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=11483</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=11483"/>
		<updated>2016-10-15T19:37:30Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
TODO&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&gt;
&lt;br /&gt;
[[Глоссарий#Вычислительная мощность|Вычислительная мощность]] алгоритма&lt;br /&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;
&lt;br /&gt;
TODO&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>Nataliya</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=11444</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=11444"/>
		<updated>2016-10-15T19:31:12Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
TODO&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма&lt;br /&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;
&lt;br /&gt;
TODO&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>Nataliya</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=11422</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=11422"/>
		<updated>2016-10-15T19:28:00Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
TODO&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&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;
&lt;br /&gt;
TODO&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>Nataliya</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=11359</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=11359"/>
		<updated>2016-10-15T19:18:37Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Локальность данных и вычислений */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
TODO&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&gt;
&lt;br /&gt;
Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
TODO&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>Nataliya</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=11331</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=11331"/>
		<updated>2016-10-15T19:14:15Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: &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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
TODO&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&gt;
&lt;br /&gt;
Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае QR-алгоритм не обязан сходиться. Однако внеся в элементы матрицы сколь угодно малые возмущения, всегда можно удовлетворить указанным условиям.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== [[Локальность данных и вычислений]] ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
TODO&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>Nataliya</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=11168</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=11168"/>
		<updated>2016-10-15T18:43:04Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Ресурс параллелизма алгоритма */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&gt;
&lt;br /&gt;
Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае 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>Nataliya</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=11149</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=11149"/>
		<updated>2016-10-15T18:38:10Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера;&lt;br /&gt;
* параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, при классификации по высоте ярусно-параллельной формы сложность равна &amp;lt;math&amp;gt;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;
Соотношение последовательной и параллельной сложности является ... (отношение ...)&lt;br /&gt;
&lt;br /&gt;
Если рассмотренные в разделе «[[#Сходимость QR-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае 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>Nataliya</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=11112</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=11112"/>
		<updated>2016-10-15T18:29:44Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* QR-алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера.&lt;br /&gt;
Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, высота ярусно-параллельной формы равна &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;
При классификации по ширине ярусно-параллельной формы, сложность 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-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае 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>Nataliya</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=11109</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=11109"/>
		<updated>2016-10-15T18:29:12Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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 разложения (4)#Сходимость 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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера.&lt;br /&gt;
Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, высота ярусно-параллельной формы равна &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;
При классификации по ширине ярусно-параллельной формы, сложность 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-алгоритма|Сходимость QR-алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае 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>Nataliya</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=11106</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=11106"/>
		<updated>2016-10-15T18:28:22Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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 разложения (4)#Сходимость 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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&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; при использовании метода Гивенса или &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; при использовании метода Хаусхолдера.&lt;br /&gt;
Параллельная сложность умножения матриц равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, для проверки, является ли матрица верхне-треугольной, достаточно одного яруса.&lt;br /&gt;
Таким образом, высота ярусно-параллельной формы равна &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;
При классификации по ширине ярусно-параллельной формы, сложность 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;
Если рассмотренные в разделе «[[#|Особенности реализации последовательного алгоритма]]» условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае 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>Nataliya</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=11083</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=11083"/>
		<updated>2016-10-15T18:22:25Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Свойства алгоритма */&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 разложения (4)#Сходимость 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;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
Если рассмотренные в условия 1-3 не выполнены, то, возможно, ни один из поддиагональных блоков не сходится к нулю. Это означает, что в общем случае 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>Nataliya</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=10823</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=10823"/>
		<updated>2016-10-15T17:29:00Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Вычислительное ядро алгоритма */&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 \times n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
= Программная реализация алгоритма =&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>Nataliya</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=10787</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=10787"/>
		<updated>2016-10-15T17:20:52Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Вычислительное ядро алгоритма */&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 \times n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
= Программная реализация алгоритма =&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>Nataliya</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=10739</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=10739"/>
		<updated>2016-10-15T17:12:09Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Существующие реализации алгоритма */&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 \times n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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-алгоритм сходится медленно - одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;gt; (то есть &amp;lt;math&amp;gt;h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
= Программная реализация алгоритма =&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>Nataliya</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=10736</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=10736"/>
		<updated>2016-10-15T17:11:55Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Существующие реализации алгоритма */&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 \times n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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-алгоритм сходится медленно - одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;gt; (то есть &amp;lt;math&amp;gt;h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
= Программная реализация алгоритма =&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>Nataliya</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=10730</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=10730"/>
		<updated>2016-10-15T17:11:04Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Существующие реализации алгоритма */&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 \times n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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-алгоритм сходится медленно - одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;gt; (то есть &amp;lt;math&amp;gt;h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
= Программная реализация алгоритма =&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>Nataliya</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=10719</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=10719"/>
		<updated>2016-10-15T17:08:54Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Последовательная сложность алгоритма */&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 \times n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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-алгоритм сходится медленно - одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций. Это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;gt; (то есть &amp;lt;math&amp;gt;h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&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; арифметических операций, сложность перемножения квадратных матриц равна &amp;lt;math&amp;gt;n^3 + O(n^2)&amp;lt;/math&amp;gt;. Таким образом, каждая итерация имеет кубическую сложность и, если алгоритм сходится через &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций, общая сложность составит &amp;lt;math&amp;gt;O(N \times 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;
&lt;br /&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;
= Программная реализация алгоритма =&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>Nataliya</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=9930</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=9930"/>
		<updated>2016-10-15T14:32:58Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сокращение затрат на одну итерацию */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно.&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 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;gt; (то есть &amp;lt;math&amp;gt;h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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-итерациям.&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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение с помощью матриц отражения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]]): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
*QR-разложение с помощью матриц вращения ([[Метод_Гивенса_(вращений)_QR-разложения_матрицы_|метод Гивенса]]): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* QR-разложение процессом Грамма-Шмидта: &amp;lt;math&amp;gt;2n^3 + O(n^2)&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;
&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;
== Информационный граф ==&lt;br /&gt;
&lt;br /&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=9907</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=9907"/>
		<updated>2016-10-15T14:29:47Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сокращение затрат на одну итерацию */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно.&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 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;gt; (то есть &amp;lt;math&amp;gt;h_{ij} = 0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i &amp;gt; j + 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;H = PAP^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;P&amp;lt;/math&amp;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-итерациям.&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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение с помощью матриц отражения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]]): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
*QR-разложение с помощью матриц вращения ([[Метод_Гивенса_(вращений)_QR-разложения_матрицы_|метод Гивенса]]): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* QR-разложение процессом Грамма-Шмидта: &amp;lt;math&amp;gt;2n^3 + O(n^2)&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;
&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;
== Информационный граф ==&lt;br /&gt;
&lt;br /&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=9838</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=9838"/>
		<updated>2016-10-15T14:14:01Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сокращение затрат на одну итерацию */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно.&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 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно привести к унитарно подобной верхней хессенберговой матрице &amp;lt;math&amp;gt;H = (h_{ij})&amp;lt;/math&amp;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-итерациям.&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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение с помощью матриц отражения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]]): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
*QR-разложение с помощью матриц вращения ([[Метод_Гивенса_(вращений)_QR-разложения_матрицы_|метод Гивенса]]): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* QR-разложение процессом Грамма-Шмидта: &amp;lt;math&amp;gt;2n^3 + O(n^2)&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;
&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;
== Информационный граф ==&lt;br /&gt;
&lt;br /&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=9834</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=9834"/>
		<updated>2016-10-15T14:11:07Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сходимость QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N \times O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно.&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 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
  &#039;&#039;&#039;if&#039;&#039;&#039; use_hessenberg_form:&lt;br /&gt;
      A = to_hessenberg_form(A)&lt;br /&gt;
  &#039;&#039;&#039;while&#039;&#039;&#039; not is_upper_triangular(A):&lt;br /&gt;
      Q, R = QR_decomposition(A)&lt;br /&gt;
      A = R * Q&lt;br /&gt;
  &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* QR-разложение с помощью матриц отражения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_матрицы|метод Хаусхолдера]]): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
*QR-разложение с помощью матриц вращения ([[Метод_Гивенса_(вращений)_QR-разложения_матрицы_|метод Гивенса]]): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
* QR-разложение процессом Грамма-Шмидта: &amp;lt;math&amp;gt;2n^3 + O(n^2)&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;
&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;
== Информационный граф ==&lt;br /&gt;
&lt;br /&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8253</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=8253"/>
		<updated>2016-10-14T21:25:48Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Последовательная сложность алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&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;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные элементы алгоритма:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
# Умножение плотных матриц&lt;br /&gt;
# Проверка диагональности матрицы&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; not is_diagonal(A):  &lt;br /&gt;
     Q, R = QR_decomposition(A)&lt;br /&gt;
     A = R * Q&lt;br /&gt;
 &#039;&#039;&#039;return&#039;&#039;&#039; diagonal_items(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-разложение с помощью матриц отражения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|метод Хаусхолдера]]): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
QR-разложение с помощью матриц вращения ([[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|метод Гивенса]]): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8216</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=8216"/>
		<updated>2016-10-14T21:17:37Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Последовательная сложность алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-разложение с помощью матриц отражения ([[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|метод Хаусхолдера]]): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
QR-разложение с помощью матриц вращения (метод Гивенса): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8205</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=8205"/>
		<updated>2016-10-14T21:14:07Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Последовательная сложность алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&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-разложение с помощью матриц отражения (метод Хаусхолдера): &amp;lt;math&amp;gt;\frac{4}{3}n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
QR-разложение с помощью матриц вращения (метод Гивенса): &amp;lt;math&amp;gt;2n^3 + O(n^2)&amp;lt;/math&amp;gt; арифметических операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8090</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=8090"/>
		<updated>2016-10-14T20:10:23Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Математическое описание алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8089</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=8089"/>
		<updated>2016-10-14T20:09:01Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Общее описание алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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; — унитарная (ортогональная) матрица, &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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8080</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=8080"/>
		<updated>2016-10-14T20:01:33Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сходимость QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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-разложения заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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; — унитарная (ортогональная) матрица, &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 разложения (4)#Сходимость 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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8079</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=8079"/>
		<updated>2016-10-14T19:59:51Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сходимость QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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-разложения заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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; — унитарная (ортогональная) матрица, &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 разложения (4)#Сходимость 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&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8076</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=8076"/>
		<updated>2016-10-14T19:57:45Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сходимость QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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-разложения заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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; — унитарная (ортогональная) матрица, &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 разложения (4)#Сходимость 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}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\Lambda_1 \in \mathbb{C}^{m \times m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\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&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8074</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=8074"/>
		<updated>2016-10-14T19:56:14Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Сходимость QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR-разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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-разложения заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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; — унитарная (ортогональная) матрица, &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 разложения (4)#Сходимость 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}&amp;lt;/math&amp;gt;, \quad &amp;lt;math&amp;gt;\Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\Lambda_1 \in \mathbb{C}^{m \times m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\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&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</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=8073</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=8073"/>
		<updated>2016-10-14T19:55:38Z</updated>

		<summary type="html">&lt;p&gt;Nataliya: /* Математическое описание алгоритма */&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;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;&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-разложения заключается в построении последовательности матриц, сходящейся по форме к клеточному правому треугольному виду. Матрицы &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;
&#039;&#039;&#039;QR-алгоритм:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt; — исходная матрица.&amp;lt;br&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; — унитарная (ортогональная) матрица, &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 разложения (4)#Сходимость 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}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\Lambda = \begin{bmatrix} \Lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \Lambda_2 \end{bmatrix}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\Lambda_1 \in \mathbb{C}^{m \times m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\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&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \lambda_1, \ldots, \lambda_m \} = \lambda(\Lambda_1)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\{ \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;
В общем случае QR-алгоритм сходится медленно. Одна QR-итерация для матрицы общего вида требует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; арифметических операций, это очень большие затраты, даже если итераций не очень много (обычно их требуется не больше 5 на каждое собственное значение). Для решения данной проблемы используют тот факт, что с помощью отражений или вращений матрицу &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;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-итерациям.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная квадратная матрица &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;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Nataliya</name></author>
	</entry>
</feed>