<?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=Dlitvinov</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=Dlitvinov"/>
	<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/Dlitvinov"/>
	<updated>2026-10-22T22:57:54Z</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=21541</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=21541"/>
		<updated>2017-01-14T15:44:20Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{assignment}}&lt;br /&gt;
Авторы статьи: Литвинов Д.А., 611, Шер А.В., 628. Авторы внесли равнозначный вклад в написание статьи.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn + 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 + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаются исходная матрица &amp;lt;math&amp;gt;A&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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Ниже представлен граф одной итерации алгоритма с разделением на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; потоков.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algorithm_scheme_(v._3).svg|1350px|thumb|center| Рисунок 1. Детальный граф алгоритма Ланцоша с выборочной переортогонализацией.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Oper - простая операция сложения/вычитания/умножения/деления с числами с плавающей точкой.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;?&#039; - проверка условия на необходимость переортогонализации.&amp;lt;br&amp;gt;&amp;lt;br&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;q_{j+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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
Исследование масштабируемости алгоритма проводилось на суперкомпьютере&lt;br /&gt;
[//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Для тестирования была выбрана реализация&lt;br /&gt;
[//crd-legacy.lbl.gov/~osni/marques.html#BLZPACK BLZPACK]. BLZPACK написан&lt;br /&gt;
на FORTRAN 77 в 2001 году и использует MPI для параллелизма.&lt;br /&gt;
&lt;br /&gt;
Для запуска BLZPACK необходима программа-драйвер. Использовался один из&lt;br /&gt;
встроенных драйверов DRVMPI (файл &amp;lt;tt&amp;gt;drv/double/drvmpi.f&amp;lt;/tt&amp;gt;) c измененными&lt;br /&gt;
параметрами -- они меняются в зависимости от размера матрицы и количества&lt;br /&gt;
требуемых пар собственных значений/векторов. Параметры устанавливаются в начале&lt;br /&gt;
файла drvmpi.f.&lt;br /&gt;
&lt;br /&gt;
Поскольку в мануале (&amp;lt;tt&amp;gt;doc/manual.ps&amp;lt;/tt&amp;gt;) нету полного описания этих параметров,&lt;br /&gt;
прокомментируем некоторые из них. Например, для матрицы размера 7500х7500&lt;br /&gt;
использовались следующие значения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      INTEGER          LEIG&lt;br /&gt;
      PARAMETER        (LEIG   =     30)&lt;br /&gt;
&lt;br /&gt;
      INTEGER          LISTOR&lt;br /&gt;
      PARAMETER        (LISTOR =  15000)&lt;br /&gt;
&lt;br /&gt;
      INTEGER          LN&lt;br /&gt;
      PARAMETER        (LN     =    7500)&lt;br /&gt;
&lt;br /&gt;
      INTEGER          LRSTOR&lt;br /&gt;
      PARAMETER        (LRSTOR =  10000000)&lt;br /&gt;
&lt;br /&gt;
      INTEGER          NCUV&lt;br /&gt;
      PARAMETER        (NCUV   =      1)&lt;br /&gt;
&lt;br /&gt;
      INTEGER          NNZMAX&lt;br /&gt;
      PARAMETER        (NNZMAX =  28128750)&lt;br /&gt;
&lt;br /&gt;
      DOUBLE PRECISION ONE&lt;br /&gt;
      PARAMETER        (ONE    =  1.0D0)&lt;br /&gt;
&lt;br /&gt;
      DOUBLE PRECISION ZERO&lt;br /&gt;
      PARAMETER        (ZERO   =  0.0D0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tt&amp;gt;LEIG&amp;lt;/tt&amp;gt; -- размер массива для хранения полученных собственных&lt;br /&gt;
векторов/значений.&lt;br /&gt;
*&amp;lt;tt&amp;gt;LISTOR&amp;lt;/tt&amp;gt; -- размер массива &amp;lt;tt&amp;gt;ISTOR&amp;lt;/tt&amp;gt;. Формула определения его минимального размера приведена в мануале.&lt;br /&gt;
*&amp;lt;tt&amp;gt;LN&amp;lt;/tt&amp;gt; -- порядок матрицы &amp;lt;tt&amp;gt;A&amp;lt;/tt&amp;gt;, т.е. &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;LRSTOR&amp;lt;/tt&amp;gt; -- размер массива &amp;lt;tt&amp;gt;RSTOR&amp;lt;/tt&amp;gt;. Формула определения его минимального размера приведена в мануале.&lt;br /&gt;
*&amp;lt;tt&amp;gt;NNZMAX&amp;lt;/tt&amp;gt; -- количество строк во входном файле с матрицей А. Драйвер &amp;lt;tt&amp;gt;DRVMPI&amp;lt;/tt&amp;gt; прочитывает симметричную верхнетреугольную матрицу из файла в координатном формате (строка, столбец, значение); таким образом, для плотной матрицы &amp;lt;tt&amp;gt;NNZMAX&amp;lt;/tt&amp;gt; будет равен &amp;lt;math&amp;gt;(n^2 + n)/2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сам запуск &amp;lt;tt&amp;gt;DRVMPI&amp;lt;/tt&amp;gt; конфигурируется в файле &amp;lt;tt&amp;gt;drvsp1.dat&amp;lt;/tt&amp;gt; -- там задаётся количество требуемых&lt;br /&gt;
собственных значений/векторов, имя файла со входной матрицей и некоторые другие параметры.&lt;br /&gt;
&lt;br /&gt;
Входные матрицы генерировались следующим простым скриптом на Python 2.7:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    n = 7500&lt;br /&gt;
    num_rows = (n*n + n) / 2&lt;br /&gt;
&lt;br /&gt;
    with open(&#039;matr7500.data&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        for i in xrange(1, n + 1):&lt;br /&gt;
            j = i  # column number&lt;br /&gt;
            while j &amp;lt;= n:&lt;br /&gt;
                value = random.uniform(-1, 1)&lt;br /&gt;
                f.write(&amp;quot;    &amp;quot; + str(i) + &amp;quot;    &amp;quot; + str(j) + &amp;quot;    &amp;quot; + &#039;{:.14e}&#039;.format(value) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
                j += 1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Был использован компилятор GNU Fortran 77 (g77), точнее, его обертка&lt;br /&gt;
&amp;lt;tt&amp;gt;mpif77&amp;lt;/tt&amp;gt; с поддержкой MPI. На Blue Gene/P используется собственная&lt;br /&gt;
реализация MPI от IBM, основанная на MPICH. Для сборки BLZPACK на Blue Gene/P&lt;br /&gt;
нужно заменить имя компилятора (ключ FC) в файле &amp;lt;tt&amp;gt;sys/MACROS/Linux&amp;lt;/tt&amp;gt; на&lt;br /&gt;
&amp;lt;tt&amp;gt;mpif77&amp;lt;/tt&amp;gt; и запустить &amp;lt;tt&amp;gt;./creator -f -mpi&amp;lt;/tt&amp;gt; в корне проекта.  После&lt;br /&gt;
этого можно собрать драйвер, зайдя в директорию &amp;lt;tt&amp;gt;drv/data&amp;lt;/tt&amp;gt; и выполнив&lt;br /&gt;
&amp;lt;tt&amp;gt;make drvmpi.x&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Использовался SMP-режим работы Blue Gene/P, когда на каждом вычислительном&lt;br /&gt;
узле выполняется всего один MPI-процесс.&lt;br /&gt;
&lt;br /&gt;
Пример запуска программы:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mpisubmit.bg -n 64 -w 00:15:00 -m smp  --stdout eigen.out --stderr eigen.err drvmpi.x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тестировались следующие конфигурации:&lt;br /&gt;
* Порядок матриц 1000, 2500, 5000, 7500&lt;br /&gt;
* Количество процессоров 4, 8, 16, 32, 64, 128&lt;br /&gt;
&lt;br /&gt;
У матрицы размера 1000 производился поиск 100 пар собственных векторов/значений,&lt;br /&gt;
у остальных -- 30 пар. Результаты приведены в таблице 1:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|[[File:Pfeil_SO.svg|none|20px]]&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 4 !! 8 !! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot;| Размер матрицы&lt;br /&gt;
! 1000&lt;br /&gt;
| 24 || 17 || 14 || 15 || 16 || 21&lt;br /&gt;
|-&lt;br /&gt;
! 2500&lt;br /&gt;
| 48 || 27 || 18 || 13 || 12 || 13&lt;br /&gt;
|-&lt;br /&gt;
! 5000&lt;br /&gt;
| 207 || 92 || 61 || 37 || 24 || 23&lt;br /&gt;
|-&lt;br /&gt;
! 7500&lt;br /&gt;
| 612 || 298 || 153 || 90 || 50 || 42&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Заметно, при всех размерах матриц алгоритм перестает масштабироваться начиная с&lt;br /&gt;
некоторого числа процессоров: для матрицы размера 1000 это 32 узла, для матрицы&lt;br /&gt;
размера 2500 64 узла и т.д. Это связано с тем, что затраты на коммуникацию между&lt;br /&gt;
узлами становится больше, чем выгода от распараллеливания вычислений. При&lt;br /&gt;
меньшем же количестве процессоров алгоритм хорошо масштабируется, соответствуя&lt;br /&gt;
теоретически вычисленной высоте ярусно-параллельной формы &amp;lt;math&amp;gt;O(kn + k^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;
[http://slepc.upv.es/documentation/reports/str6.pdf A Survey of Software for Sparse Eigenvalue Problems]&lt;br /&gt;
&lt;br /&gt;
Ниже будут перечислены только те реализации, которые поддерживают именно выборочную ортогонализацию.&lt;br /&gt;
&lt;br /&gt;
* [http://crd-legacy.lbl.gov/~osni/ BLZPACK] FORTRAN 77, MPI. 2000 год.&lt;br /&gt;
* [http://www.cas.mcmaster.ca/~qiao/BLKLAN BLKLAN] C, MATLAB. Нет поддержки параллелизма. 2003 год. &lt;br /&gt;
* [http://sun.stanford.edu/~rmunk/PROPACK/ PROPACK] FORTRAN 77, MATLAB. OpenMP. Предназначен для нахождения SVD разложения, но алгоритм Ланцоша может быть вызван и напрямую. 2005 год.&lt;br /&gt;
* [http://www.netlib.org/lanz/ LANZ] FORTRAN 77. Нет поддержки параллелизма. 1991 год.&lt;br /&gt;
* [http://www.netlib.org/svdpack/ SVDPACK] C, FORTRAN 77. Нет поддержки параллелизма. Предназначен для нахождения SVD разложения. 1992 год.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=21535</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=21535"/>
		<updated>2017-01-12T20:14:23Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn + 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 + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаются исходная матрица &amp;lt;math&amp;gt;A&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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Ниже представлен граф одной итерации алгоритма с разделением на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; потоков.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Algorithm_scheme_(v._3).svg|1350px|thumb|center| Рисунок 1. Детальный граф алгоритма Ланцоша с выборочной переортогонализацией.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Oper - простая операция сложения/вычитания/умножения/деления с числами с плавающей точкой.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;?&#039; - проверка условия на необходимость переортогонализации.&amp;lt;br&amp;gt;&amp;lt;br&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;q_{j+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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.caam.rice.edu/software/ARPACK/ ARPACK library]&lt;br /&gt;
* [https://www.nada.kth.se/~ruhe/2D5219/work/lanso.m KTH ROYAL INSTITUTE OF TECHNOLOGY]&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library THE NAG LIBRARY]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=21534</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=21534"/>
		<updated>2017-01-11T19:31:37Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn + 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 + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаются исходная матрица &amp;lt;math&amp;gt;A&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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Ниже представлен граф одной итерации алгоритма с разделением на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; потоков.&lt;br /&gt;
&lt;br /&gt;
[[Файл:algorithm_scheme_svg.svg|1350px|thumb|center| Oper - простая операция сложения/вычитания/умножения/деления с числами с плавающей точкой.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;?&#039; - проверка условия на необходимость переортогонализации.&amp;lt;br&amp;gt;&amp;lt;br&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;q_{j+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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.caam.rice.edu/software/ARPACK/ ARPACK library]&lt;br /&gt;
* [https://www.nada.kth.se/~ruhe/2D5219/work/lanso.m KTH ROYAL INSTITUTE OF TECHNOLOGY]&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library THE NAG LIBRARY]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18895</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18895"/>
		<updated>2016-11-21T21:25:27Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn + 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 + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Ниже представлен граф одной итерации алгоритма с разделением на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; потоков.&lt;br /&gt;
&lt;br /&gt;
[[Файл:algorithm_scheme_svg.svg|1350px|thumb|center| Oper - простая операция сложения/вычитания/умножения/деления с числами с плавающей точкой.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;?&#039; - проверка условия на необходимость переортогонализации.&amp;lt;br&amp;gt;&amp;lt;br&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;q_{j+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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.caam.rice.edu/software/ARPACK/ ARPACK library]&lt;br /&gt;
* [https://www.nada.kth.se/~ruhe/2D5219/work/lanso.m KTH ROYAL INSTITUTE OF TECHNOLOGY]&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library THE NAG LIBRARY]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18892</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18892"/>
		<updated>2016-11-21T21:21:56Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn + 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 + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Ниже представлен граф одной итерации алгоритма с разделением на &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; потоков.&lt;br /&gt;
&lt;br /&gt;
[[Файл:algorithm_scheme_svg.svg|1350px|thumb|center| Oper - простая операция сложения/вычитания/умножения/деления с числами с плавающей точкой.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;?&#039; - проверка условия на необходимость переортогонализации.&amp;lt;br&amp;gt;&amp;lt;br&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;q_{j+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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.caam.rice.edu/software/ARPACK/ ARPACK library]&lt;br /&gt;
* [https://www.nada.kth.se/~ruhe/2D5219/work/lanso.m KTH ROYAL INSTITUTE OF TECHNOLOGY]&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library THE NAG LIBRARY]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18815</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18815"/>
		<updated>2016-11-21T16:03:02Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn + 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 + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.caam.rice.edu/software/ARPACK/ ARPACK library]&lt;br /&gt;
* [https://www.nada.kth.se/~ruhe/2D5219/work/lanso.m KTH ROYAL INSTITUTE OF TECHNOLOGY]&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library THE NAG LIBRARY]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18814</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18814"/>
		<updated>2016-11-21T15:56:08Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Соотношение последовательной и параллельной сложности алгоритма равно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, что говорит о том, что параллельная реализация теоретически должна давать ощутимый выигрыш&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&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;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;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.caam.rice.edu/software/ARPACK/ ARPACK library]&lt;br /&gt;
* [https://www.nada.kth.se/~ruhe/2D5219/work/lanso.m KTH ROYAL INSTITUTE OF TECHNOLOGY]&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library THE NAG LIBRARY]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
* Дж. Деммель, Вычислительная линейная алгебра. Теория и приложения. Пер. с англ. - М.: Мир, 2001.&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18029</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=18029"/>
		<updated>2016-11-17T21:11:22Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/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;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;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;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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 + 1&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;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;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;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;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>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17821</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17821"/>
		<updated>2016-11-16T21:09:32Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;. Эти приближения называются &#039;&#039;числами Ритца&#039;&#039;. Если &amp;lt;math&amp;gt;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&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-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + 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;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суммарная последовательная сложность алгоритма - &amp;lt;math&amp;gt;O(kn^2 + k^2n)&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17814</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17814"/>
		<updated>2016-11-16T20:24:39Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;. Эти приближения называются &#039;&#039;числами Ритца&#039;&#039;. Если &amp;lt;math&amp;gt;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j : O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} : O(n k^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;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;j: 1 \le j \le k&amp;lt;/math&amp;gt; следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Умножается матрица на вектор для нахождения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисляется коэффициент &amp;lt;math&amp;gt;\Alpha_j&amp;lt;/math&amp;gt; посредством скалярного перемножения векторов&lt;br /&gt;
# Вычисляется новое значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Производятся оценка погрешностей &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; и выборочная переортогонализация&lt;br /&gt;
# Вычисление очередного значения &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;&lt;br /&gt;
# Вычисление и добавление к матрице &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; нового столбца&lt;br /&gt;
# Вычисление собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17692</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17692"/>
		<updated>2016-11-16T13:35:18Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;. Эти приближения называются &#039;&#039;числами Ритца&#039;&#039;. Если &amp;lt;math&amp;gt;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
У описанного алгоритма два ядра, на которые приходится основное время работы алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z = A q_j - O(n^2)&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация &amp;lt;math&amp;gt;z = z - (y_{i,k} ^ T z) y_{i,k} - O(n k^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>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17132</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=17132"/>
		<updated>2016-11-14T21:07:21Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;. Эти приближения называются &#039;&#039;числами Ритца&#039;&#039;. Если &amp;lt;math&amp;gt;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Где &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; - это столбцы ортогональной матрицы &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V \Lambda V^T&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; - столбцы матрицы &amp;lt;math&amp;gt;Q_k V&amp;lt;/math&amp;gt; - векторы Ритца.&lt;br /&gt;
&lt;br /&gt;
Согласно теореме Пейджа, &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1} = O(\epsilon \Vert A \Vert_2) / \beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, то есть компонента &amp;lt;math&amp;gt;y_{k,i}^T q_{k+1}&amp;lt;/math&amp;gt; вычисленного вектора Ланцоша &amp;lt;math&amp;gt;q_{k+1}&amp;lt;/math&amp;gt; в направлении вектора Ритца &amp;lt;math&amp;gt;y_{k,i} = Q_k v_i&amp;lt;/math&amp;gt; обратно пропорциональна величине &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt;, являющейся оценкой погрешности для соответствующего числа Ритца. Поэтому, когда число Ритца сходится, а его оценка погрешности приближается к нулю, вектор Ланцоша приобретает большую компоненту в направлении вектора Ритца &amp;lt;math&amp;gt;q_{k,i}&amp;lt;/math&amp;gt;, и следует произвести процедуру переортогонализации. &lt;br /&gt;
&lt;br /&gt;
Величина погрешности &amp;lt;math&amp;gt;\beta_k \Vert v_i(k) \Vert&amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\epsilon} \Vert A \Vert_2&amp;lt;/math&amp;gt;, так как в этом случае, согласно теореме Пейджа, компонента &amp;lt;math&amp;gt;\Vert y_{i,k}^T q_{k+1} \Vert = \Vert y_{i,k}^T z \Vert / \Vert z \Vert_2&amp;lt;/math&amp;gt; скорее всего превосходит уровень &amp;lt;math&amp;gt;\sqrt{\epsilon}&amp;lt;/math&amp;gt; (на практике используется &amp;lt;math&amp;gt;\Vert T_k \Vert_2&amp;lt;/math&amp;gt; вместо &amp;lt;math&amp;gt;\Vert A \Vert_2&amp;lt;/math&amp;gt;, так как первое известно, а второе не всегда).&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=16851</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=16851"/>
		<updated>2016-11-14T00:45:43Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;. Эти приближения называются &#039;&#039;числами Ритца&#039;&#039;. Если &amp;lt;math&amp;gt;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная симметричная матрица, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; - вектор начального приближения метода Ланцоша.&lt;br /&gt;
Тогда алгоритм Ланцоша вычисления собственных векторов и собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с выборочной ортогонализацией записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b / \Vert b \Vert_2, \; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = A\,q_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q_j^T z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_j q_j - \beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; for \; i \le k \\&lt;br /&gt;
&amp;amp; \; \; \; if \; \beta_k \|v_i (k)\| \le \sqrt{\epsilon} \Vert T_k \Vert_2\\&lt;br /&gt;
&amp;amp; \; \; \; \; \; \; z = z - (y_{i,k} ^ T z) y_{i,k}\\&lt;br /&gt;
&amp;amp; end \; for\\&lt;br /&gt;
&amp;amp; \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j = 0 \; then\\&lt;br /&gt;
&amp;amp; \; \; \; Quit\; the\; algorithm\\&lt;br /&gt;
&amp;amp; q_{j+1} = z / \beta_j\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dlitvinov</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=16825</id>
		<title>Участник:Dlitvinov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:Dlitvinov/%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%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%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=16825"/>
		<updated>2016-11-13T23:04:39Z</updated>

		<summary type="html">&lt;p&gt;Dlitvinov: Новая страница: «Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описан…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор статьи: Литвинов Д.А., студент, кафедра исследования операций, 611 группа - все описанные разделы.&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; применяется для поиска небольшого числа собственных значений большой разреженной симметричной матрицы и объединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца интерпретации собственных значений некоторой вычисляемой матрицы как приближений к собственным значениям заданной матрицы.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_k,Q_u]&amp;lt;/math&amp;gt; - ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;Q_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 k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n \times (n-k)&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; вычисляются методом Ланцоша.&lt;br /&gt;
Запишем следующие соотношения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;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;. Эти приближения называются &#039;&#039;числами Ритца&#039;&#039;. Если &amp;lt;math&amp;gt;A = V \Lambda V^T&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&amp;lt;/math&amp;gt; являются приближениями соответствующих собственных векторов и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Числа и векторы Ритца являются &#039;&#039;оптимальными&#039;&#039; приближениями к собственным значениям и собственным векторам матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: минимум величины &amp;lt;math&amp;gt;\Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;P_k = Q_k V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \Lambda&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_k&amp;lt;/math&amp;gt; пропадает из-за ошибок округления. Для того чтобы поддерживать ортогональность, проводится повторный процесс ортогонализации Грама-Шмидта. Доказано, что векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; теряют ортогональность весьма систематическим образом, приобретая большие компоненты в отношении уже сошедшихся векторов Ритца. Поэтому можно выборочно ортогонализировать векторы &amp;lt;math&amp;gt;q_k&amp;lt;/math&amp;gt; вместо того, чтобы на каждом шаге ортогонализировать вектор ко всем более ранним векторам, как это делается при полной ортогонализации. Таким образом достигается очень высокая степень ортогонализации векторов Ланцоша, и затрачивается очень небольшая дополнительная работа.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - заданная&lt;/div&gt;</summary>
		<author><name>Dlitvinov</name></author>
	</entry>
</feed>