<?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=Kozlov+Vladimir</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=Kozlov+Vladimir"/>
	<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/Kozlov_Vladimir"/>
	<updated>2026-10-23T01:52:03Z</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=14799</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=14799"/>
		<updated>2016-10-30T12:30:44Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор — Козлов Владимир, 617 гр.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм комбинирует &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=14151</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=14151"/>
		<updated>2016-10-27T10:01:18Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор — Козлов Владимир, 617 гр.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм комбинирует &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Kozlov_Vladimir&amp;diff=14135</id>
		<title>Обсуждение участника:Kozlov Vladimir</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Kozlov_Vladimir&amp;diff=14135"/>
		<updated>2016-10-27T01:08:52Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Статья Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале статьи&lt;br /&gt;
** Добавил.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=14134</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=14134"/>
		<updated>2016-10-27T01:06:47Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор — Козлов Владимир, 617 гр.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12775</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12775"/>
		<updated>2016-10-16T19:18:05Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Автор — Козлов Владимир, 617 гр.&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12773</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12773"/>
		<updated>2016-10-16T19:16:50Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12771</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12771"/>
		<updated>2016-10-16T19:15:28Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12765</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12765"/>
		<updated>2016-10-16T19:13:28Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12763</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12763"/>
		<updated>2016-10-16T19:12:45Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;
* [[https://www.nag.co.uk/content/nag-library|The NAG Library]] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [[http://www.caam.rice.edu/software/ARPACK/|ARPACK]].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12742</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12742"/>
		<updated>2016-10-16T19:01:07Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Программная реализация алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12740</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12740"/>
		<updated>2016-10-16T18:59:40Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; изолированных вершин (каждый элемент вектора результата считается независимо). Информационный граф для алгоритма вычисления нормы вектора представляет собой цепь из &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;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>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12727</id>
		<title>Файл:Lanczoc-full-orth-macro.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12727"/>
		<updated>2016-10-16T18:45:03Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-macro.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-iter.png&amp;diff=12724</id>
		<title>Файл:Lanczoc-full-orth-iter.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-iter.png&amp;diff=12724"/>
		<updated>2016-10-16T18:41:34Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-iter.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф одной итерации алгоритма Ланцоша с полной переортогонализацией&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12720</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12720"/>
		<updated>2016-10-16T18:31:47Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;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>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12717</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12717"/>
		<updated>2016-10-16T18:10:24Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12716</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12716"/>
		<updated>2016-10-16T18:09:42Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для реализации &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12701</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12701"/>
		<updated>2016-10-16T17:47:50Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12698</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12698"/>
		<updated>2016-10-16T17:39:42Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12697</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12697"/>
		<updated>2016-10-16T17:39:27Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Размер входных данных: &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12692</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12692"/>
		<updated>2016-10-16T17:09:05Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12690</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12690"/>
		<updated>2016-10-16T17:06:54Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — нормировка вектора (вычисление еклидовой нормы и деление каждой компоненты вектора на неё), Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12689</id>
		<title>Файл:Lanczoc-full-orth-macro.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12689"/>
		<updated>2016-10-16T17:03:58Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-macro.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12688</id>
		<title>Файл:Lanczoc-full-orth-macro.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12688"/>
		<updated>2016-10-16T17:03:18Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-macro.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-iter.png&amp;diff=12687</id>
		<title>Файл:Lanczoc-full-orth-iter.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-iter.png&amp;diff=12687"/>
		<updated>2016-10-16T17:02:00Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-iter.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф одной итерации алгоритма Ланцоша с полной переортогонализацией&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12686</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12686"/>
		<updated>2016-10-16T17:00:45Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|800px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — нормировка вектора (вычисление еклидовой нормы и деление каждой компоненты вектора на неё), Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|800px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — нормировка вектора (вычисление еклидовой нормы и деление каждой компоненты вектора на неё), Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12684</id>
		<title>Файл:Lanczoc-full-orth-macro.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12684"/>
		<updated>2016-10-16T16:59:28Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-macro.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12682</id>
		<title>Файл:Lanczoc-full-orth-macro.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12682"/>
		<updated>2016-10-16T16:58:30Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Kozlov Vladimir загрузил новую версию Файл:Lanczoc-full-orth-macro.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-iter.png&amp;diff=12679</id>
		<title>Файл:Lanczoc-full-orth-iter.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-iter.png&amp;diff=12679"/>
		<updated>2016-10-16T16:55:45Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Информационный граф одной итерации алгоритма Ланцоша с полной переортогонализацией&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф одной итерации алгоритма Ланцоша с полной переортогонализацией&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12630</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12630"/>
		<updated>2016-10-16T15:31:18Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|800px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — нормировка вектора (вычисление еклидовой нормы и деление каждой компоненты вектора на неё), Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12629</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12629"/>
		<updated>2016-10-16T15:30:50Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|800px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;)]], nrm — нормировка вектора (вычисление еклидовой нормы и деление каждой компоненты вектора на неё), Iter — итерации алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12627</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12627"/>
		<updated>2016-10-16T15:27:43Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|800px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In ]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12626</id>
		<title>Файл:Lanczoc-full-orth-macro.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lanczoc-full-orth-macro.png&amp;diff=12626"/>
		<updated>2016-10-16T15:27:16Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12622</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12622"/>
		<updated>2016-10-16T15:17:51Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|800px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;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>Kozlov Vladimir</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:Kozlov_Vladimir&amp;diff=12609</id>
		<title>Участник:Kozlov Vladimir</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:Kozlov_Vladimir&amp;diff=12609"/>
		<updated>2016-10-16T15:03:21Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: Новая страница: «Козлов Владимир Дмитриевич. Студент ВМК, 2 курс магистратуры, группа 617.»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Козлов Владимир Дмитриевич. Студент ВМК, 2 курс магистратуры, группа 617.&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12319</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12319"/>
		<updated>2016-10-15T23:23:04Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12316</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12316"/>
		<updated>2016-10-15T23:19:36Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k + nk^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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12315</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12315"/>
		<updated>2016-10-15T23:19:12Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет сложность &amp;lt;math&amp;gt;O(n^2k + nk^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;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12310</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12310"/>
		<updated>2016-10-15T23:11:50Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&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;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12308</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12308"/>
		<updated>2016-10-15T23:09:40Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/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;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12271</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12271"/>
		<updated>2016-10-15T22:40:09Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/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;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;gt; сложений и вычитаний;&lt;br /&gt;
* одно извлечение квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Всего за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)j&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12255</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12255"/>
		<updated>2016-10-15T22:22:10Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/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;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12249</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12249"/>
		<updated>2016-10-15T22:18:31Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма по указанным выше формулам имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12247</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12247"/>
		<updated>2016-10-15T22:17:33Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма по указанным выше формулам имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12245</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12245"/>
		<updated>2016-10-15T22:17:01Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма по указанным выше формулам имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12243</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12243"/>
		<updated>2016-10-15T22:16:30Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма по указанным выше формулам имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input: } A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output: }\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12241</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12241"/>
		<updated>2016-10-15T22:16:18Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма по указанным выше формулам имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input: } A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output: }\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12239</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12239"/>
		<updated>2016-10-15T22:15:41Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма по указанным выше формулам имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input: } A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output: }\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12235</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12235"/>
		<updated>2016-10-15T22:13:21Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма напрямую по указанным выше формулам в алгоритме имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
Можно предложить также и другой набор макрооперация, соответствующий использованию дополнительной памяти для выполнения переортогонализации:&lt;br /&gt;
* арифметические операции над матрицами и векторами;&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора.&lt;br /&gt;
* вычисление произведений вида &amp;lt;math&amp;gt;QQ^T&amp;lt;/math&amp;gt; — поскольку итоговая матрица является симметричной, можно такие произведения можно считать вдвое быстрее, чем обычные.&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input: } A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output: }\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12214</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12214"/>
		<updated>2016-10-15T21:54:51Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма напрямую по указанным выше формулам в алгоритме имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
Можно предложить также и другой набор макрооперация, соответствующий использованию дополнительной памяти для выполнения переортогонализации:&lt;br /&gt;
* арифметические операции над матрицами и векторами;&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора.&lt;br /&gt;
* вычисление произведений вида &amp;lt;math&amp;gt;QQ^T&amp;lt;/math&amp;gt; — поскольку итоговая матрица является симметричной, можно такие произведения можно считать вдвое быстрее, чем обычные.&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input: } A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output: }\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации для ортогонализации требуется выполнить дважды умножение матрицы &amp;lt;math&amp;gt;Q^T&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;j \times n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;nj&amp;lt;/math&amp;gt; умножений, &amp;lt;math&amp;gt;(n - 1)j&amp;lt;/math&amp;gt; сложений), дважды умножить матрицу &amp;lt;math&amp;gt;Q &amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; на получившийся вектор длины &amp;lt;math&amp;gt; j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;nj&amp;lt;/math&amp;gt; умножений, &amp;lt;math&amp;gt;n(j - 1)&amp;lt;/math&amp;gt; сложений) и дважды вычесть полученный вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений). Итого &amp;lt;math&amp;gt;4nj&amp;lt;/math&amp;gt; умножений, &amp;lt;math&amp;gt;4nj - 2j&amp;lt;/math&amp;gt; сложений. После &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций это превращается в &amp;lt;math&amp;gt;2nk(k - 1) = O(nk^2)&amp;lt;/math&amp;gt; умножений, &amp;lt;math&amp;gt;(2n - 1)k(k - 1) = O(nk^2)&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Если же переортогонализацию представить в виде &amp;lt;math&amp;gt;z = z - \left(Q Q^T\right) z = \left(I - Q Q^T\right) z&amp;lt;/math&amp;gt;, то можно вдвое сократить время на переортогонолизацию: и в первом, и во втором прогоне используется дна и та же матрица &amp;lt;math&amp;gt;I - Q Q^T&amp;lt;/math&amp;gt;, которую можно посчитать всего один раз. Далее, оба прогона ортогонализации можно объединить: &amp;lt;math&amp;gt;z = \left(I - Q Q^T\right)^2 z&amp;lt;/math&amp;gt;, а так как &amp;lt;math&amp;gt;I - Q Q^T&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12136</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=12136"/>
		<updated>2016-10-15T21:20:10Z</updated>

		<summary type="html">&lt;p&gt;Kozlov Vladimir: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; — это итерационный алгоритм поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#039;&#039;&#039;метод Ланцоша&#039;&#039;&#039; построения крыловского подпространства.&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца является методом поиска &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; приближённых собственных значений симметричной вещественной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;mathA&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt;;&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Для реализации алгоритма напрямую по указанным выше формулам в алгоритме имеет смысл выделить следующие макрооперации:&lt;br /&gt;
* арифметические операции над матрицами и векторами (сложение и умножение на число);&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* добавление к матрице столбца.&lt;br /&gt;
&lt;br /&gt;
Можно предложить также и другой набор макрооперация, соответствующий использованию дополнительной памяти для выполнения переортогонализации:&lt;br /&gt;
* арифметические операции над матрицами и векторами;&lt;br /&gt;
* умножение матрицы на вектор и скалярное произведение векторов;&lt;br /&gt;
* вычисление нормы вектора.&lt;br /&gt;
* вычисление произведений вида &amp;lt;math&amp;gt;QQ^T&amp;lt;/math&amp;gt; — поскольку итоговая матрица является симметричной, можно такие произведения можно считать вдвое быстрее, чем обычные.&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Если переортогонализацию производить на каждом шаге строго по приведённым выше формулам, то получается следующий алгоритм:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input: } A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output: }\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/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;/div&gt;</summary>
		<author><name>Kozlov Vladimir</name></author>
	</entry>
</feed>