<?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=Danyanya</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=Danyanya"/>
	<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/Danyanya"/>
	<updated>2026-10-23T00:56:50Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=20234</id>
		<title>Обсуждение участника:Danyanya</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=20234"/>
		<updated>2016-12-07T06:55:48Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:10, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Графы на рисунках в разделе 1.7 не являются графами алгоритма (граф алгоритма по определению ациклический, вершины соответствуют операторам, дуги - передаче информации между ними); рисунки должны быть пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Если показываете на графе (рис.1) входные и выходные данные, лучше их описать не как &amp;quot;Input&amp;quot; и &amp;quot;Output&amp;quot;, а подписать конкретные элементы данных. А на рис.2 почему-то входных и выходных данных нет. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:27, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть приведена оценка вычислительной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Ошибся в предыдущем замечании - имелась в виду оценка вычислительной мощности. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:24, 1 ноября 2016 (MSK)&lt;br /&gt;
* Рис.4 и 5 вставлены в статью крайне неудачно. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не объяснены множественные особенности получившихся графиков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* убрать * в качестве умножения в математических формулах +&lt;br /&gt;
* 1.3 хотелось бы подробнее... +&lt;br /&gt;
* 1.6 &amp;quot;имеет сложность O(kn^2) и односится к квадратичным алгоритмам&amp;quot; - уточните, а как же &amp;quot;k&amp;quot;? + &lt;br /&gt;
* 1.7 - хорошие графы, хотелось бы их словесного описания и, может быть, обсуждения (также чуть уменьшить поле отображения рисунков) +&lt;br /&gt;
* 2.4 Сборка:  информация &amp;quot;lanczos-mpi.cpp -o lanczos-mpi&amp;quot; совершенно лишняя +&lt;br /&gt;
* Рис.4-5 - странные значения на шкале &amp;quot;Cores&amp;quot; +&lt;br /&gt;
* хорошо смотрится самостоятельность реализации на С++&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20233</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20233"/>
		<updated>2016-12-07T06:55:37Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; с предыдущей итерации:&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При больших &amp;lt;math&amp;gt;k&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; много меньше &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходя из предложенной последовательной реализации метода, макрооперациями в алгоритме являются:&lt;br /&gt;
&lt;br /&gt;
* Процедура итеративного построения трехдиагональной симметричной матрицы, включающая:&lt;br /&gt;
** умножение матрицы на вектор (состоит из умножения вектора на число и сложения векторов);&lt;br /&gt;
** скалярное произведение векторов;&lt;br /&gt;
** линейная комбинация векторов (сложение/умножение на вещественные числа);&lt;br /&gt;
** вычисление нормы (скалярное произведение векторов и вычисление квадратного корня); &lt;br /&gt;
* Вычисление собственных значений и собственных векторов полученной в ходе работы трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
При этом, первая макрооперация (построение трехдиагональной матрицы) выполняется строго последовательно. Единственное, что можно распараллелить - это умножение матрицы на вектор. Однако это операция достаточно легковесная, если оперировать, например, разреженной матрицей. &lt;br /&gt;
&lt;br /&gt;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + n(4k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(kn^2) &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;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|600px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|600px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&amp;lt;/math&amp;gt; — выходной результат.]]&lt;br /&gt;
&lt;br /&gt;
Из информационного графа видно, что паралеллизация алгоритма возможна при выполнении линенйного оператора &amp;lt;math&amp;gt;Ax&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n(n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Grigorev_lanczos_eff_no_02.png|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Grigorev_lanczos_eff_o2.png|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=20232</id>
		<title>Обсуждение участника:Danyanya</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=20232"/>
		<updated>2016-12-07T06:52:48Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:10, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Графы на рисунках в разделе 1.7 не являются графами алгоритма (граф алгоритма по определению ациклический, вершины соответствуют операторам, дуги - передаче информации между ними); рисунки должны быть пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Если показываете на графе (рис.1) входные и выходные данные, лучше их описать не как &amp;quot;Input&amp;quot; и &amp;quot;Output&amp;quot;, а подписать конкретные элементы данных. А на рис.2 почему-то входных и выходных данных нет. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:27, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть приведена оценка вычислительной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Ошибся в предыдущем замечании - имелась в виду оценка вычислительной мощности. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:24, 1 ноября 2016 (MSK)&lt;br /&gt;
* Рис.4 и 5 вставлены в статью крайне неудачно. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не объяснены множественные особенности получившихся графиков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* убрать * в качестве умножения в математических формулах +&lt;br /&gt;
* 1.3 хотелось бы подробнее... +&lt;br /&gt;
* 1.6 &amp;quot;имеет сложность O(kn^2) и односится к квадратичным алгоритмам&amp;quot; - уточните, а как же &amp;quot;k&amp;quot;? + &lt;br /&gt;
* 1.7 - хорошие графы, хотелось бы их словесного описания и, может быть, обсуждения (также чуть уменьшить поле отображения рисунков)&lt;br /&gt;
* 2.4 Сборка:  информация &amp;quot;lanczos-mpi.cpp -o lanczos-mpi&amp;quot; совершенно лишняя +&lt;br /&gt;
* Рис.4-5 - странные значения на шкале &amp;quot;Cores&amp;quot; +&lt;br /&gt;
* хорошо смотрится самостоятельность реализации на С++&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20231</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=20231"/>
		<updated>2016-12-07T06:52:36Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; с предыдущей итерации:&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При больших &amp;lt;math&amp;gt;k&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; много меньше &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходя из предложенной последовательной реализации метода, макрооперациями в алгоритме являются:&lt;br /&gt;
&lt;br /&gt;
* Процедура итеративного построения трехдиагональной симметричной матрицы, включающая:&lt;br /&gt;
** умножение матрицы на вектор (состоит из умножения вектора на число и сложения векторов);&lt;br /&gt;
** скалярное произведение векторов;&lt;br /&gt;
** линейная комбинация векторов (сложение/умножение на вещественные числа);&lt;br /&gt;
** вычисление нормы (скалярное произведение векторов и вычисление квадратного корня); &lt;br /&gt;
* Вычисление собственных значений и собственных векторов полученной в ходе работы трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
При этом, первая макрооперация (построение трехдиагональной матрицы) выполняется строго последовательно. Единственное, что можно распараллелить - это умножение матрицы на вектор. Однако это операция достаточно легковесная, если оперировать, например, разреженной матрицей. &lt;br /&gt;
&lt;br /&gt;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + n(4k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(kn^2) &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;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|600px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|600px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n(n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Grigorev_lanczos_eff_no_02.png|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Grigorev_lanczos_eff_o2.png|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=19589</id>
		<title>Обсуждение участника:Danyanya</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=19589"/>
		<updated>2016-11-30T06:35:27Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:10, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Графы на рисунках в разделе 1.7 не являются графами алгоритма (граф алгоритма по определению ациклический, вершины соответствуют операторам, дуги - передаче информации между ними); рисунки должны быть пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Если показываете на графе (рис.1) входные и выходные данные, лучше их описать не как &amp;quot;Input&amp;quot; и &amp;quot;Output&amp;quot;, а подписать конкретные элементы данных. А на рис.2 почему-то входных и выходных данных нет. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:27, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть приведена оценка вычислительной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Ошибся в предыдущем замечании - имелась в виду оценка вычислительной мощности. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:24, 1 ноября 2016 (MSK)&lt;br /&gt;
* Рис.4 и 5 вставлены в статью крайне неудачно. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не объяснены множественные особенности получившихся графиков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* убрать * в качестве умножения в математических формулах +&lt;br /&gt;
* 1.3 хотелось бы подробнее... +&lt;br /&gt;
* 1.6 &amp;quot;имеет сложность O(kn^2) и односится к квадратичным алгоритмам&amp;quot; - уточните, а как же &amp;quot;k&amp;quot;?&lt;br /&gt;
* 1.7 - хорошие графы, хотелось бы их словесного описания и, может быть, обсуждения (также чуть уменьшить поле отображения рисунков)&lt;br /&gt;
* 2.4 Сборка:  информация &amp;quot;lanczos-mpi.cpp -o lanczos-mpi&amp;quot; совершенно лишняя +&lt;br /&gt;
* Рис.4-5 - странные значения на шкале &amp;quot;Cores&amp;quot;&lt;br /&gt;
* хорошо смотрится самостоятельность реализации на С++&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19588</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19588"/>
		<updated>2016-11-30T06:33:28Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; с предыдущей итерации:&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При больших &amp;lt;math&amp;gt;k&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; много меньше &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Исходя из предложенной последовательной реализации метода, макрооперациями в алгоритме являются:&lt;br /&gt;
&lt;br /&gt;
* Процедура итеративного построения трехдиагональной симметричной матрицы, включающая:&lt;br /&gt;
** умножение матрицы на вектор (состоит из умножения вектора на число и сложения векторов);&lt;br /&gt;
** скалярное произведение векторов;&lt;br /&gt;
** линейная комбинация векторов (сложение/умножение на вещественные числа);&lt;br /&gt;
** вычисление нормы (скалярное произведение векторов и вычисление квадратного корня); &lt;br /&gt;
* Вычисление собственных значений и собственных векторов полученной в ходе работы трехдиагональной симметричной матрицы.&lt;br /&gt;
&lt;br /&gt;
При этом, первая макрооперация (построение трехдиагональной матрицы) выполняется строго последовательно. Единственное, что можно распараллелить - это умножение матрицы на вектор. Однако это операция достаточно легковесная, если оперировать, например, разреженной матрицей. &lt;br /&gt;
&lt;br /&gt;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + n(4k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(kn^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;
[[Файл:mgrigoriev2.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|600px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|600px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n(n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19498</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19498"/>
		<updated>2016-11-29T17:18:06Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + n(4k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(kn^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;
[[Файл:mgrigoriev2.png|600px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|600px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|600px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n(n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19497</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=19497"/>
		<updated>2016-11-29T17:15:58Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; kn^2 + n(4k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k(n^2+3n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(kn^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;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n(n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k\log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k(2n^2+8n-1)+3n}{n^2+2k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 &amp;lt;CPP_FILE&amp;gt; -lm -static-libstdc++&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=19496</id>
		<title>Обсуждение участника:Danyanya</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=19496"/>
		<updated>2016-11-29T17:15:51Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:10, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Графы на рисунках в разделе 1.7 не являются графами алгоритма (граф алгоритма по определению ациклический, вершины соответствуют операторам, дуги - передаче информации между ними); рисунки должны быть пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Если показываете на графе (рис.1) входные и выходные данные, лучше их описать не как &amp;quot;Input&amp;quot; и &amp;quot;Output&amp;quot;, а подписать конкретные элементы данных. А на рис.2 почему-то входных и выходных данных нет. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:27, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть приведена оценка вычислительной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Ошибся в предыдущем замечании - имелась в виду оценка вычислительной мощности. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:24, 1 ноября 2016 (MSK)&lt;br /&gt;
* Рис.4 и 5 вставлены в статью крайне неудачно. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не объяснены множественные особенности получившихся графиков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* убрать * в качестве умножения в математических формулах +&lt;br /&gt;
* 1.3 хотелось бы подробнее...&lt;br /&gt;
* 1.6 &amp;quot;имеет сложность O(kn^2) и односится к квадратичным алгоритмам&amp;quot; - уточните, а как же &amp;quot;k&amp;quot;?&lt;br /&gt;
* 1.7 - хорошие графы, хотелось бы их словесного описания и, может быть, обсуждения (также чуть уменьшить поле отображения рисунков)&lt;br /&gt;
* 2.4 Сборка:  информация &amp;quot;lanczos-mpi.cpp -o lanczos-mpi&amp;quot; совершенно лишняя +&lt;br /&gt;
* Рис.4-5 - странные значения на шкале &amp;quot;Cores&amp;quot;&lt;br /&gt;
* хорошо смотрится самостоятельность реализации на С++&lt;/div&gt;</summary>
		<author><name>Danyanya</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=19495</id>
		<title>Обсуждение участника:Danyanya</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Danyanya&amp;diff=19495"/>
		<updated>2016-11-29T17:14:09Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:10, 16 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 кроме выделения макроопераций требуется показать и их взаимосвязь. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
* Графы на рисунках в разделе 1.7 не являются графами алгоритма (граф алгоритма по определению ациклический, вершины соответствуют операторам, дуги - передаче информации между ними); рисунки должны быть пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Если показываете на графе (рис.1) входные и выходные данные, лучше их описать не как &amp;quot;Input&amp;quot; и &amp;quot;Output&amp;quot;, а подписать конкретные элементы данных. А на рис.2 почему-то входных и выходных данных нет. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:27, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть приведена оценка вычислительной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:44, 25 октября 2016 (MSK)&lt;br /&gt;
** Ошибся в предыдущем замечании - имелась в виду оценка вычислительной мощности. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:24, 1 ноября 2016 (MSK)&lt;br /&gt;
* Рис.4 и 5 вставлены в статью крайне неудачно. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не объяснены множественные особенности получившихся графиков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:02, 21 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;br /&gt;
* убрать * в качестве умножения в математических формулах +&lt;br /&gt;
* 1.3 хотелось бы подробнее...&lt;br /&gt;
* 1.6 &amp;quot;имеет сложность O(kn^2) и односится к квадратичным алгоритмам&amp;quot; - уточните, а как же &amp;quot;k&amp;quot;?&lt;br /&gt;
* 1.7 - хорошие графы, хотелось бы их словесного описания и, может быть, обсуждения (также чуть уменьшить поле отображения рисунков)&lt;br /&gt;
* 2.4 Сборка:  информация &amp;quot;lanczos-mpi.cpp -o lanczos-mpi&amp;quot; совершенно лишняя&lt;br /&gt;
* Рис.4-5 - странные значения на шкале &amp;quot;Cores&amp;quot;&lt;br /&gt;
* хорошо смотрится самостоятельность реализации на С++&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18862</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18862"/>
		<updated>2016-11-21T19:31:53Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 lanczos-mpi.cpp -lm -static-libstdc++ -o lanczos-mpi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18861</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18861"/>
		<updated>2016-11-21T19:31:12Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 lanczos-mpi.cpp -lm -static-libstdc++ -o lanczos-mpi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, средняя эффективность минимальна при малых входных данных (на размере матрицы в 10000). &lt;br /&gt;
В среднем данный показатель держится между 9% и 14%.&lt;br /&gt;
&lt;br /&gt;
При этом, оптимизация компилятора MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45,5% против 14,7%). Однако, как можно заметить из графиков, при оптимизации алгоритм ведет себя более нестабильно, скорее всего из-за значительной траты времени на работу с памятью (более планые участки свидетельствует о том, что необходимые данные нашлись в кеше).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18807</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18807"/>
		<updated>2016-11-21T14:30:59Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Программа запускалась на суперкомьютере &amp;quot;Ломоносов&amp;quot; со следующими характеристиками:&lt;br /&gt;
* Компилятор GCC 5.2.1;&lt;br /&gt;
* Версия MPI 1.8.4;&lt;br /&gt;
* Сборка проводилась командой: &amp;lt;pre&amp;gt;mpic++ -std=c++0x -O2 lanczos-mpi.cpp -lm -static-libstdc++ -o lanczos-mpi&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном числе нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|center|600px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с оптимизацией компилятора GCC (-O2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|center|600px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора -O2.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, оптимизация компиляра MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45 против 15 процентов).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18420</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18420"/>
		<updated>2016-11-18T22:07:04Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. &lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
Полученная эффективность реализации варьируется в пределах от 2% (на маленьких входных данных) до 45% (на больших входных данных и максимальном число нодов).&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|left|574px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|right|574px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI с использованием оптимизации компилятора.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с флагами оптимизации.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, оптимизация компиляра MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45 против 15 процентов).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18419</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18419"/>
		<updated>2016-11-18T22:02:42Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
/* Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. */&lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|left|574px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|right|574px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с флагами оптимизации.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, оптимизация компиляра MPIC++ позволяет получить выигрыш в эффективности более чем в 3 раза (45 против 15 процентов).&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18414</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18414"/>
		<updated>2016-11-18T21:51:36Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
/* Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org]. */&lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 175000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
На рисунке 4 представлена эффективность программы при отсутствии флага оптимизации O2. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_no_02.jpg|thumb|left|570px|Рисунок 4. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
[[Файл:Danyanya_lanczos_eff_o2.jpg|thumb|right|570px|Рисунок 5. Эффективность параллельной реализации алгоритма Ланцоща на MPI.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке 5 представлена эффективность алгоритма с флагами оптимизации.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше, оптимизация - это не пустой звук.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18376</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18376"/>
		<updated>2016-11-18T21:05:11Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|thumb|center|747px|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|880px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org].&lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 150000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.1 ...&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.2 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше,&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18354</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18354"/>
		<updated>2016-11-18T20:57:35Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.4, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.4, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|800px|thumb|center|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|800px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org].&lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 150000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.1 ...&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.2 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше,&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18348</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18348"/>
		<updated>2016-11-18T20:56:36Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|800px|thumb|center|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|800px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org].&lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 150000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.1 ...&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.2 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше,&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R). Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Для проверки масшабируемости, алгоритм был реализован на языке C++ с применением MPI [https://github.com/danyanya/ss16-task1].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18342</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=18342"/>
		<updated>2016-11-18T20:54:52Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
* Граф линейного оператора. &lt;br /&gt;
[[Файл:mgrigoriev2.png|800px|thumb|center|Рисунок 1. Информационный граф алгоритма.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev3.png|800px|thumb|center|Рисунок 2. Информационный граф линейного оператора &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt; - операции сложения и умножения.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:mgrigoriev1.png|800px|thumb|center|Рисунок 3. Граф алгоритма с указанием входных и выходных данных.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;*&amp;lt;/math&amp;gt;  — операция умножения,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&amp;lt;br/&amp;gt;&lt;br /&gt;
▽ - условие выхода &amp;lt;math&amp;gt;\mathsf{(\beta_i = 0)}&amp;lt;/math&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{A, b, q_0 = 0, \beta_0 = 0}&amp;lt;/math&amp;gt; — входные данные, &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{\alpha_i, \beta_i}&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Для исследования масшабируемости алгоритма была написана реализация[https://github.com/danyanya/ss16-task1] на языке C++ с использованием MPI. Реализация была протестирована на суперкомпьютере Ломоносов[http://parallel.ru/cluster/].&lt;br /&gt;
&lt;br /&gt;
Были исследованы:&lt;br /&gt;
* время выполнения программы в зависимости от размера входных данных (матрицы);&lt;br /&gt;
* время выполнения в зависимости от размера параллельных нод.&lt;br /&gt;
&lt;br /&gt;
Дополнительно было измерено время работы исходя из оптимизационных флагов компилятора GCC [https://gcc.gnu.org].&lt;br /&gt;
&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 20000 до 150000 с шагом 2500;&lt;br /&gt;
* количество процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.1 ...&lt;br /&gt;
&lt;br /&gt;
На рисунке 2.4.2 ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как видно из графиков выше,&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15715</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15715"/>
		<updated>2016-11-02T06:22:07Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;\log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15714</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15714"/>
		<updated>2016-11-02T06:21:39Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15713</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15713"/>
		<updated>2016-11-02T06:21:24Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15712</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15712"/>
		<updated>2016-11-02T06:01:29Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(k*n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k* \log(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n*(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k*(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15711</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15711"/>
		<updated>2016-11-02T06:00:48Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k * \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15710</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15710"/>
		<updated>2016-11-02T06:00:30Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации из последовательной сложности алгоритма &amp;lt;math&amp;gt;\frac{k*(2*n^2+8*n-1)+3*n}{n^2+2*k}&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; много меньше  &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вычислительная мощность ≈ &amp;lt;math&amp;gt; 2*k&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15709</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15709"/>
		<updated>2016-11-02T05:55:17Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Суммарное число операций в алгоритме без учета вычисления собственных значений в трехдиагональной памяти:&lt;br /&gt;
* &amp;lt;math&amp;gt; k*n^2 + n * (4 * k + 1) &amp;lt;/math&amp;gt; операций умножения;&lt;br /&gt;
* &amp;lt;math&amp;gt; k*(n^2+3*n-2) +  n-1&amp;lt;/math&amp;gt; операций сложения/вычитания;&lt;br /&gt;
* &amp;lt;math&amp;gt; n*(k + 1) &amp;lt;/math&amp;gt; операций деления;&lt;br /&gt;
* &amp;lt;math&amp;gt; k + 1 &amp;lt;/math&amp;gt; операций вычислений квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации TODO&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15708</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15708"/>
		<updated>2016-11-02T05:52:03Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Вычислительная мощность алгоритма Ланцоша без переортогонализации TODO&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15616</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15616"/>
		<updated>2016-11-01T17:31:34Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на границе ее спектра (в &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15126</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15126"/>
		<updated>2016-10-31T14:57:19Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{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;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15125</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=15125"/>
		<updated>2016-10-31T14:56:06Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Граф алгоритма с отображением входных и выходных данных. &lt;br /&gt;
[[Файл:Algorithm graph.png|800px|thumb|center| Рисунок 1. Граф алгоритма с отображением входных и выходных данных.&lt;br /&gt;
&amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt; — вычисление нормы, &lt;br /&gt;
&amp;lt;math&amp;gt;/&amp;lt;/math&amp;gt; — операция деления, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{F}&amp;lt;/math&amp;gt; — вычисление линейной комбинации векторов, &lt;br /&gt;
&amp;lt;math&amp;gt;\cdot&amp;lt;/math&amp;gt;  — операция умножения,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt; — линейный оператор (Рисунок 2),&lt;br /&gt;
▽ - условие выхода,&lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Input}&amp;lt;/math&amp;gt; — входные данные, &lt;br /&gt;
&amp;lt;math&amp;gt;\mathsf{Output}&amp;lt;/math&amp;gt; — выходные результат.]]&lt;br /&gt;
&lt;br /&gt;
* Подграф линейного оператора.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Linear operator.png|800px|thumb|center| Рисунок 2. Подграф алгоритма, описывающий линейный оператор &amp;lt;math&amp;gt;\mathsf{Ax}&amp;lt;/math&amp;gt;. &amp;lt;br/&amp;gt; &amp;lt;math&amp;gt;+&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;*&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;A^{n * n}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;&amp;amp;nbsp;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;-ой по ширине ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{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;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14820</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14820"/>
		<updated>2016-10-30T14:29:41Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(klog(n))&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * n)}&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложенийж&lt;br /&gt;
** При этом сложение элементов вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; можно выполнить за &amp;lt;math&amp;gt;log(n)&amp;lt;/math&amp;gt;[https://algowiki-project.org/ru/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%83%D0%BC%D0%BC%D1%8B_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0_%D1%81%D0%B4%D0%B2%D0%B0%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC];&lt;br /&gt;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;-ой сложностью по высоте ЯПФ и по ширине ЯПФ &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* Сложность последовательного алгоритма &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;; &lt;br /&gt;
&lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{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;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14818</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14818"/>
		<updated>2016-10-30T14:23:25Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;O(k \log n)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
** Таким образом, отношение последовательной сложности  к параллельной &amp;lt;math&amp;gt;\frac{kn^2}{k \log{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;T_{j}&amp;lt;/math&amp;gt; в первую очередь появляются максимальные по модулю собственные значения);&lt;br /&gt;
&lt;br /&gt;
* Из-за использования точной арифметики алгоритм Ланшоца может найти кратные собственные значения, которые на деле оными не являются;&lt;br /&gt;
&lt;br /&gt;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14817</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14817"/>
		<updated>2016-10-30T14:04:46Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
* По классификации по высоте ЯПФ Алгоритм Ланцоша является алгоритмом со сложностью &amp;lt;math&amp;gt;O(k \log n)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* По классификации по ширине ЯПФ его сложность &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм Ланцоша без переортогонализации не является детерминированным из-за того, что возможно выполнение меньшего числа итераций алгоритма, из-за того, что все собственные значения уже вычислены;&lt;br /&gt;
&lt;br /&gt;
* Также алгоритм Ланцоша быстро сходится при вычислении собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14816</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14816"/>
		<updated>2016-10-30T14:02:07Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
Вычисление собственных значений полученной матрицы на практике выполняется с помощью QR-алгоритма и выходит за рамки описанного алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14812</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14812"/>
		<updated>2016-10-30T13:08:59Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14803</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14803"/>
		<updated>2016-10-30T12:41:37Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца[https://en.wikipedia.org/wiki/Rayleigh%E2%80%93Ritz_method]. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14797</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=14797"/>
		<updated>2016-10-30T12:20:06Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:  [[Участник:danyanya|Д.Р.Слюсарь]] (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2.7), [[Участник:m.grigoriev|М.А.Григорьев]] (1.2, 1.7, 1.8, 1.9, 2.7, 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году &amp;lt;ref&amp;gt;Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&amp;lt;/ref&amp;gt;. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающий отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный [[Алгоритм Ланцоша с полной переортогонализацией | алгоритм Ланцоша с полной переортогонализацией]] предложенный в 1970 Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша &amp;lt;ref&amp;gt;https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша&amp;lt;/ref&amp;gt; на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&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/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project &amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. MatLab &amp;lt;ref&amp;gt;https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Julia Math &amp;lt;ref&amp;gt;https://github.com/JuliaMath/IterativeSolvers.jl&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается встроенной возможности параллелизма - самыми стабильными в этом плане являются ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11201</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11201"/>
		<updated>2016-10-15T18:52:00Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается про встроенную возможность параллелизма - самым стабильным в этом плане является ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&lt;br /&gt;
&lt;br /&gt;
2.  Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
3. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11195</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11195"/>
		<updated>2016-10-15T18:51:01Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Также существуют официальные реализации на других языках (например R).&lt;br /&gt;
&lt;br /&gt;
Что касается про встроенную возможность параллелизма - самым стабильным в этом плане является ARPACK, а также IETL.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&lt;br /&gt;
&lt;br /&gt;
2.  Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
3. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11173</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11173"/>
		<updated>2016-10-15T18:44:08Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Lanczos, C. &amp;quot;An iteration method for the solution of the eigenvalue problem of linear differential and integral operators&amp;quot;, J. Res. Nat’l Bur. Std. 45, 255-282 (1950).&lt;br /&gt;
&lt;br /&gt;
2.  Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
3. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11154</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11154"/>
		<updated>2016-10-15T18:39:51Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае матрица симметрична)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [https://ru.wikipedia.org/wiki/Биортогонализация_Ланцоша] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На выходе алгоритма получается собственные векторы и вектор собственных значений матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, с помощью которых и будет найдены искомые собственные векторы исходной матрицы &amp;lt;math&amp;gt;A&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11130</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11130"/>
		<updated>2016-10-15T18:34:35Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма (эффект &#039;&#039;ложной сходимости&#039;&#039;) присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11125</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11125"/>
		<updated>2016-10-15T18:33:22Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
* Нестабильность алгоритма присуще плавающей арифметике, из-за ошибок округления в которой на очередном этапе может быть построен линейно зависимый от исходных новый вектор, что повлечет невозможность дальнейшего приближения собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11095</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11095"/>
		<updated>2016-10-15T18:25:27Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций.&lt;br /&gt;
&lt;br /&gt;
* Умножение &amp;lt;math&amp;gt;A^{(n * 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;
* Остальные операции в рамках итерации выполняются последовательно (вычисление значений векторов может быть выполнено за 1 ярус):&lt;br /&gt;
* Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышеизложенного, алгоритм Ланцоша обладает линейной сложностью по ширине ЯПФ и по высоте ЯПФ.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11002</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=11002"/>
		<updated>2016-10-15T18:02:41Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланцоша имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10987</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10987"/>
		<updated>2016-10-15T18:00:05Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланшоца имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10985</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10985"/>
		<updated>2016-10-15T17:59:42Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланшоца имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&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;A&amp;lt;/math&amp;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;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10911</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10911"/>
		<updated>2016-10-15T17:47:15Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланшоца имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;IN&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;EIGEN&#039;&#039;) (Рис. 1); &lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|800px|thumb|center|Общий граф алгоритма. IN - вход, Iter - одна итерация алгоритма, EIGEN - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
* Подграф на каждой итерации внутри цикла (от &#039;&#039;IN&#039;&#039; до &#039;&#039;NEXT&#039;&#039; в рисунке 2);&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|800px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке Norm). Красными стрелками показаны переходы в непараллельные секции (переход в NEXT неизбежен, из-за чего помечен зеленым)]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
TDB&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10822</id>
		<title>Участник:Danyanya/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:Danyanya/%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_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=10822"/>
		<updated>2016-10-15T17:28:56Z</updated>

		<summary type="html">&lt;p&gt;Danyanya: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики (без переортогонализации)&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:danyanya|Д.Р.Слюсарь]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Алгоритм Ланцоша поиска собственных значений &#039;&#039;&#039; был опубликован Корнелием Ланцошем в 1950 году [http://nvlpubs.nist.gov/nistpubs/jres/045/4/V45.N04.A01.pdf]. Этот итерационный алгоритм применим только к эрмитовым матрицам &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
Метод позволяет за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций вычислять &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ое приближение собственных значений и собственных векторов исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В данной статье рассмотрен упрощенный вариант алгоритма Ланцоша, подразумевающие отсутствие влияния ошибок округления на вычислительный процесс. &lt;br /&gt;
&lt;br /&gt;
Данный алгоритм является неустойчивым, вследствие чего на практике применяется модифицированный алгоритм Ланцоша с полной переортогонализацией.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подается эрмитова матрица &amp;lt;math&amp;gt;A = A^\dagger&amp;lt;/math&amp;gt;  &#039;&#039; (в вещественном случае - симметрическая)&#039;&#039; ,&lt;br /&gt;
{{Шаблон: ASymmetric}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша соединяет в себя метод Ланцоша построения крыловского подпространства с процедурой Релея-Ритца. Иными словами, из оргонормированных векторов Ланцоша [??] на каждой итерации строится матрица &amp;lt;math&amp;gt;Q_k = [q_1, q_2, \dots, q_k]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;. &lt;br /&gt;
В качестве приближенных собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_k = Q^T_k A Q&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
T_k = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; 0 &amp;amp; \dots &amp;amp; 0 \\ &lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 &amp;amp; \dots &amp;amp; 0 \\&lt;br /&gt;
0 &amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \vdots \\&lt;br /&gt;
\vdots &amp;amp; \vdots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k-1} \\&lt;br /&gt;
0 &amp;amp; \dots &amp;amp; \dots &amp;amp; \beta_{k-1} &amp;amp; \alpha_k&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&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;q_i&amp;lt;/math&amp;gt; с предыдущей итерации&lt;br /&gt;
:&amp;lt;math&amp;gt;z = Aq_i&amp;lt;/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;
&#039;&#039;&#039;Исходные данные&#039;&#039;&#039;: симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные&#039;&#039;&#039;: собственные вектора матрицы  &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;,  и матрица собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;V, \Lambda&amp;lt;/math&amp;gt; из спектрального разложения &amp;lt;math&amp;gt;T_k = V\Lambda V^T&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм на псевдокоде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; b/ \|b\|_2,\; \beta_0 = 0,\; q_0 = 0\\&lt;br /&gt;
for \; &amp;amp; i = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_i\\&lt;br /&gt;
&amp;amp; \alpha_i = q^T_i z\\&lt;br /&gt;
&amp;amp; z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}\\&lt;br /&gt;
&amp;amp; \beta_i = \|z\|_2\\&lt;br /&gt;
&amp;amp; If \; \beta_i == 0 \; then \\ &lt;br /&gt;
&amp;amp; \; \; \; \; exit\\&lt;br /&gt;
&amp;amp; else \\&lt;br /&gt;
&amp;amp; \; \; \; \; q_{i+1} = z / \beta_i \\&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;
&#039;&#039;После этого вычисляются собственные значения и собственные вектора симметричной трехдиагональной  матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; наиболее удобным образом.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма === &lt;br /&gt;
&lt;br /&gt;
Последовательная сложность алгоритма рассчитана на основе приведенной выше реализации алгоритма. Исходя из псевдокода последовательно выполняются следующие операции:&lt;br /&gt;
* Умножение квадратной матрицы &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n * 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&amp;lt;/math&amp;gt; умножений и сложений;&lt;br /&gt;
* Сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
* Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на скаляр. Требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
* Нахождение квадратичной нормы вектора длины &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; k \times k &amp;lt;/math&amp;gt;. Наиболее эффективный метод метода «Разделяй-и-властвуй»  в среднем требует &amp;lt;math&amp;gt;~O(k^{2.3})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в худшем случае, алгоритм Ланшоца имеет сложность &amp;lt;math&amp;gt; O(k * n^2) &amp;lt;/math&amp;gt; и односится к квадратичным алгоритмам.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма можно разбить на две части:&lt;br /&gt;
* Общий граф алгоритма, от входа &#039;&#039;Init&#039;&#039; до функции вычислений собственных значений полученной трехдиагональной матрицы (&#039;&#039;Fin&#039;&#039;); &lt;br /&gt;
* Подграф на каждой итерации внутри цикла;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-1.png|700px|thumb|center|Общий граф алгоритма. Init - вход, Iter - одна итерация алгоритма, Fin - процедура вычисления собственных значений]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Danyanya-lanczos-infopraph-2.png|700px|thumb|center|Подграф алгоритма, описывающий одну итерацию. IN - вход в очедедную итерацию, NEXT - переход к следующей итерации или выход цикла, между ними возможен параллелизм при операциях умножения/сложения, вычитания из q(i) q(i-1)-ого, а также деления нового вектора на норму (полученную в блоке normalising) ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Важно заметить, что итерации алгоритма выполняются строго последовательно, а распараллеливание возможно только внутри итераций. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма === &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число итераций &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;n * (n + 1) + 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; вектор собственных значений &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;, матрица собственных векторов &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных:&#039;&#039;&#039; &amp;lt;math&amp;gt;k * (n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
TDB&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
TDB next week &lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В настоящее время существует множество реализаций алгоритма Ланцоша итеративного поиска собственных значений, как входящих в официальные дистрибутивы для вычислений (&#039;&#039;ARPACK&#039;&#039;), так и неофициальных реализаций, выложенных на Github. Среди них:&lt;br /&gt;
&lt;br /&gt;
1. The IETL Project [http://www.comp-phys.org/software/ietl/]&lt;br /&gt;
&lt;br /&gt;
2. MatLab [https://www.mathworks.com/matlabcentral/newsreader/view_thread/10554]&lt;br /&gt;
&lt;br /&gt;
3. ARPACK [http://www.caam.rice.edu/software/ARPACK/]&lt;br /&gt;
&lt;br /&gt;
4. Julia Math [https://github.com/JuliaMath/IterativeSolvers.jl]&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
1. Алгоритм Ланцоша (Википедия) [https://en.wikipedia.org/wiki/Lanczos_algorithm]&lt;br /&gt;
&lt;br /&gt;
2. Деммель Д. Вычислительная линейная алгебра/Пер. с англ. ХД Икрамова. – 2001.&lt;/div&gt;</summary>
		<author><name>Danyanya</name></author>
	</entry>
</feed>