<?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=ArtyomKhakimov</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=ArtyomKhakimov"/>
	<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/ArtyomKhakimov"/>
	<updated>2026-10-22T16:05:09Z</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:ArtyomKhakimov&amp;diff=22331</id>
		<title>Обсуждение участника:ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22331"/>
		<updated>2017-02-06T20:11:54Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Статья Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.2 должен быть не псевдокод реализации, а описание алгоритма на математическом языке (в виде формул). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Учёл это замечание. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:38, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил описание структуры алгоритма. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:42, 6 февраля 2017 (MSK)&lt;br /&gt;
* К графу в разделе 1.7 требуются пояснения, в частности, при каких значениях внешних параметров он получен. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил пояснения а графу. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 23:11, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил оценки вычислительной мощности. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:48, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK) &lt;br /&gt;
Указал параметры компилцяии и запуска. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:56, 6 февраля 2017 (MSK)&lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Попробовал сделать выводы. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 23:06, 6 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22329</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22329"/>
		<updated>2017-02-06T20:11:13Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритма Ланцоша представляется в виде совокупности метода Ланцоша, построения крыловского подпространства и процедуры Рэлея-Ритца. &lt;br /&gt;
&lt;br /&gt;
Каждая итерация первого этапа может быть разложена на следующие макроединицы:&lt;br /&gt;
* Умножение матрицы на вектор&lt;br /&gt;
* Вычисление скалярного произведения векторов&lt;br /&gt;
* Умножение векторов на числа и вычитание векторов&lt;br /&gt;
* При выполнении условия необходимости переортогонализации – перемножение и вычитание векторов&lt;br /&gt;
* Вычисление нормы вектора&lt;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
Информационный граф был построен на основе исходного кода программы, на нём указаны основные пути передачи информации между макроблоками алгоритма и  между основными матричными и векторными операциями.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Алгоритм устойчив, так как операция переортогонализации как раз направлена на исключение проблемы округления вычисляемых значений&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;&lt;br /&gt;
* При реализации классического алгоритма Ланцоша возникает большая погрешность при округлении. Вариант с полной переортогонализацией позволяет избегать больших погрешностей, однако является более ресурсоемким.  Вариант с частичной переортогонализацией является промежуточным. &lt;br /&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;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
Использовался компилятор mpicxx в режиме openmpi/1.5.5-gcc.&lt;br /&gt;
Компиляция осуществлялась с параметрами по-умолчанию.&lt;br /&gt;
Запуск вычислений производился на узле regular4.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По наклону графика при максимальной загрузке можно заметить, что на производительность алгоритма количество вычислительных процессов влияет сильнее, чем размерность входной матрицы. Наблюдается также ускорение при количестве параллельных процессоров 32 и размерности матрицы около 40 000 из чего можно сделать вывод, что такое сочетание является оптимальным для алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22328</id>
		<title>Обсуждение участника:ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22328"/>
		<updated>2017-02-06T20:06:32Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Статья Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.2 должен быть не псевдокод реализации, а описание алгоритма на математическом языке (в виде формул). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Учёл это замечание. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:38, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил описание структуры алгоритма. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:42, 6 февраля 2017 (MSK)&lt;br /&gt;
* К графу в разделе 1.7 требуются пояснения, в частности, при каких значениях внешних параметров он получен. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил оценки вычислительной мощности. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:48, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK) &lt;br /&gt;
Указал параметры компилцяии и запуска. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:56, 6 февраля 2017 (MSK)&lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Попробовал сделать выводы. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 23:06, 6 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22327</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22327"/>
		<updated>2017-02-06T20:06:04Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритма Ланцоша представляется в виде совокупности метода Ланцоша, построения крыловского подпространства и процедуры Рэлея-Ритца. &lt;br /&gt;
&lt;br /&gt;
Каждая итерация первого этапа может быть разложена на следующие макроединицы:&lt;br /&gt;
* Умножение матрицы на вектор&lt;br /&gt;
* Вычисление скалярного произведения векторов&lt;br /&gt;
* Умножение векторов на числа и вычитание векторов&lt;br /&gt;
* При выполнении условия необходимости переортогонализации – перемножение и вычитание векторов&lt;br /&gt;
* Вычисление нормы вектора&lt;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Алгоритм устойчив, так как операция переортогонализации как раз направлена на исключение проблемы округления вычисляемых значений&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;&lt;br /&gt;
* При реализации классического алгоритма Ланцоша возникает большая погрешность при округлении. Вариант с полной переортогонализацией позволяет избегать больших погрешностей, однако является более ресурсоемким.  Вариант с частичной переортогонализацией является промежуточным. &lt;br /&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;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
Использовался компилятор mpicxx в режиме openmpi/1.5.5-gcc.&lt;br /&gt;
Компиляция осуществлялась с параметрами по-умолчанию.&lt;br /&gt;
Запуск вычислений производился на узле regular4.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
По наклону графика при максимальной загрузке можно заметить, что на производительность алгоритма количество вычислительных процессов влияет сильнее, чем размерность входной матрицы. Наблюдается также ускорение при количестве параллельных процессоров 32 и размерности матрицы около 40 000 из чего можно сделать вывод, что такое сочетание является оптимальным для алгоритма Ланцоша.&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22326</id>
		<title>Обсуждение участника:ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22326"/>
		<updated>2017-02-06T19:56:52Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Статья Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.2 должен быть не псевдокод реализации, а описание алгоритма на математическом языке (в виде формул). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Учёл это замечание. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:38, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил описание структуры алгоритма. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:42, 6 февраля 2017 (MSK)&lt;br /&gt;
* К графу в разделе 1.7 требуются пояснения, в частности, при каких значениях внешних параметров он получен. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил оценки вычислительной мощности. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:48, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK) &lt;br /&gt;
Указал параметры компилцяии и запуска. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:56, 6 февраля 2017 (MSK)&lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22325</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22325"/>
		<updated>2017-02-06T19:56:19Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритма Ланцоша представляется в виде совокупности метода Ланцоша, построения крыловского подпространства и процедуры Рэлея-Ритца. &lt;br /&gt;
&lt;br /&gt;
Каждая итерация первого этапа может быть разложена на следующие макроединицы:&lt;br /&gt;
* Умножение матрицы на вектор&lt;br /&gt;
* Вычисление скалярного произведения векторов&lt;br /&gt;
* Умножение векторов на числа и вычитание векторов&lt;br /&gt;
* При выполнении условия необходимости переортогонализации – перемножение и вычитание векторов&lt;br /&gt;
* Вычисление нормы вектора&lt;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Алгоритм устойчив, так как операция переортогонализации как раз направлена на исключение проблемы округления вычисляемых значений&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;&lt;br /&gt;
* При реализации классического алгоритма Ланцоша возникает большая погрешность при округлении. Вариант с полной переортогонализацией позволяет избегать больших погрешностей, однако является более ресурсоемким.  Вариант с частичной переортогонализацией является промежуточным. &lt;br /&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;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
Использовался компилятор mpicxx в режиме openmpi/1.5.5-gcc.&lt;br /&gt;
Компиляция осуществлялась с параметрами по-умолчанию.&lt;br /&gt;
Запуск вычислений производился на узле regular4.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22324</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22324"/>
		<updated>2017-02-06T19:55:57Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритма Ланцоша представляется в виде совокупности метода Ланцоша, построения крыловского подпространства и процедуры Рэлея-Ритца. &lt;br /&gt;
&lt;br /&gt;
Каждая итерация первого этапа может быть разложена на следующие макроединицы:&lt;br /&gt;
* Умножение матрицы на вектор&lt;br /&gt;
* Вычисление скалярного произведения векторов&lt;br /&gt;
* Умножение векторов на числа и вычитание векторов&lt;br /&gt;
* При выполнении условия необходимости переортогонализации – перемножение и вычитание векторов&lt;br /&gt;
* Вычисление нормы вектора&lt;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Алгоритм устойчив, так как операция переортогонализации как раз направлена на исключение проблемы округления вычисляемых значений&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;&lt;br /&gt;
* При реализации классического алгоритма Ланцоша возникает большая погрешность при округлении. Вариант с полной переортогонализацией позволяет избегать больших погрешностей, однако является более ресурсоемким.  Вариант с частичной переортогонализацией является промежуточным. &lt;br /&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;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
Использовался компилятор mpicxx в режиме openmpi/1.5.5-gcc&lt;br /&gt;
Компиляция осуществлялась с параметрами по-умолчанию.&lt;br /&gt;
Запуск вычислений производился на узле regular4.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22323</id>
		<title>Обсуждение участника:ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22323"/>
		<updated>2017-02-06T19:48:17Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.2 должен быть не псевдокод реализации, а описание алгоритма на математическом языке (в виде формул). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Учёл это замечание. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:38, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил описание структуры алгоритма. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:42, 6 февраля 2017 (MSK)&lt;br /&gt;
* К графу в разделе 1.7 требуются пояснения, в частности, при каких значениях внешних параметров он получен. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил оценки вычислительной мощности. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:48, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK) &lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22322</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22322"/>
		<updated>2017-02-06T19:46:58Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритма Ланцоша представляется в виде совокупности метода Ланцоша, построения крыловского подпространства и процедуры Рэлея-Ритца. &lt;br /&gt;
&lt;br /&gt;
Каждая итерация первого этапа может быть разложена на следующие макроединицы:&lt;br /&gt;
* Умножение матрицы на вектор&lt;br /&gt;
* Вычисление скалярного произведения векторов&lt;br /&gt;
* Умножение векторов на числа и вычитание векторов&lt;br /&gt;
* При выполнении условия необходимости переортогонализации – перемножение и вычитание векторов&lt;br /&gt;
* Вычисление нормы вектора&lt;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Алгоритм устойчив, так как операция переортогонализации как раз направлена на исключение проблемы округления вычисляемых значений&lt;br /&gt;
* Вычислительная мощность алгоритма - отношение числа операций к суммарному объему входных и выходных данных - примерно равно &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;&lt;br /&gt;
* При реализации классического алгоритма Ланцоша возникает большая погрешность при округлении. Вариант с полной переортогонализацией позволяет избегать больших погрешностей, однако является более ресурсоемким.  Вариант с частичной переортогонализацией является промежуточным. &lt;br /&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;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22321</id>
		<title>Обсуждение участника:ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22321"/>
		<updated>2017-02-06T19:42:18Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.2 должен быть не псевдокод реализации, а описание алгоритма на математическом языке (в виде формул). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Учёл это замечание. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:38, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Добавил список макроопераций. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:42, 6 февраля 2017 (MSK)&lt;br /&gt;
* К графу в разделе 1.7 требуются пояснения, в частности, при каких значениях внешних параметров он получен. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK) &lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22320</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22320"/>
		<updated>2017-02-06T19:41:51Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритма Ланцоша представляется в виде совокупности метода Ланцоша, построения крыловского подпространства и процедуры Рэлея-Ритца. &lt;br /&gt;
&lt;br /&gt;
Каждая итерация первого этапа может быть разложена на следующие макроединицы:&lt;br /&gt;
* Умножение матрицы на вектор&lt;br /&gt;
* Вычисление скалярного произведения векторов&lt;br /&gt;
* Умножение векторов на числа и вычитание векторов&lt;br /&gt;
* При выполнении условия необходимости переортогонализации – перемножение и вычитание векторов&lt;br /&gt;
* Вычисление нормы вектора&lt;br /&gt;
* Умножение вектора на число&lt;br /&gt;
&lt;br /&gt;
Второй этап, процедура Рэлея-Ритца, заключается в нахождении собственных значений и собственных векторов матрицы и интерпретации их как приближенных значений собственных чисел и собственных векторов исходной матрицы, он может быть выполнен любым способом, например, QR-итерацией.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22319</id>
		<title>Обсуждение участника:ArtyomKhakimov</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:ArtyomKhakimov&amp;diff=22319"/>
		<updated>2017-02-06T19:38:28Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.2 должен быть не псевдокод реализации, а описание алгоритма на математическом языке (в виде формул). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
Учёл это замечание. --[[Участник:ArtyomKhakimov|ArtyomKhakimov]] ([[Обсуждение участника:ArtyomKhakimov|обсуждение]]) 22:38, 6 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* К графу в разделе 1.7 требуются пояснения, в частности, при каких значениях внешних параметров он получен. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK) &lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:19, 3 февраля 2017 (MSK)&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22318</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22318"/>
		<updated>2017-02-06T19:37:08Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму поступает симметричная матрица math&amp;gt;A&amp;lt;/math&amp;gt; и начальный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм вычисляет собственные вектора матрицы  &amp;lt;math&amp;gt;T_k&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;. При первой итерации вектор начального приближения &amp;lt;math&amp;gt;q_1 = \frac{b}{\|b\|_2}&amp;lt;/math&amp;gt; нормируется. Затем задаются константы &amp;lt;math&amp;gt;\beta_0 = 0,\; q_0 = 0 &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;T_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\alpha_i&amp;lt;/math&amp;gt;-x и &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt;-х.&lt;br /&gt;
&lt;br /&gt;
Вычисления на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации таковы:&lt;br /&gt;
Сначала вычисляется произведение матрицы на вектор &amp;lt;math&amp;gt;z = Aq_i&amp;lt;/math&amp;gt;. Затем считается скалярное произведение &amp;lt;math&amp;gt;\alpha_i = q^T_i z&amp;lt;/math&amp;gt; и значение сохраняется как элемент формируемой матрицы. После этого подизводится вычисление линейной комбинации векторов &amp;lt;math&amp;gt;z = z - \alpha_i q_i - \beta_{i-1}q_{i-1}&amp;lt;/math&amp;gt;. Пусть норма полученного вектора - это элемент матрицы: &amp;lt;math&amp;gt;\beta_i = \|z\|_2&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;\beta_i&amp;lt;/math&amp;gt; оказалась равной нулю, то итерации заканчиваются. Далее будет следовать этап вычисления собственных значений и собственных векторов. Иначе, в конце итерации считают &amp;lt;math&amp;gt;q_{i+1} = \frac{z}{\beta_i}&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;ref&amp;gt;Деммель Д. Вычислительная линейная алгебра&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21762</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21762"/>
		<updated>2017-01-26T11:15:48Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     Провести выборочную ортогонализацию по отношению&lt;br /&gt;
     к сошедшимся векторам Ритца&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k,&amp;lt;/math&amp;gt; таких, что &amp;lt;math&amp;gt;\, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     Вычислить собственные значения и собственные векторы&lt;br /&gt;
     &amp;lt;math&amp;gt;\, \, T_{j} \, \, &amp;lt;/math&amp;gt;и оценки погрешности в них &lt;br /&gt;
 &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:Grph.PNG|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21632</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21632"/>
		<updated>2017-01-20T08:24:50Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: Содержимое страницы заменено на «{{Assignment}} Авторы: Хакимов А. С.  [https://ru.wikipedia.org/wiki/Участник:ArtyomKhakimov/Алгорит…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Участник:ArtyomKhakimov/Алгоритм_Ланцоша_для_арифметики_с_плавающей_точкой_с_выборочной_ортогонализацией Статья временно находится на Википедии]&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21611</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21611"/>
		<updated>2017-01-19T17:39:15Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{/* Провести выборочную ортогонализацию по отношению},  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{   к сошедшимся векторам Ритца */}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \text{таких, что} \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{Вычислить собственные значения и собственные векторы}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{матрицы} \, \, T_{j} \, \text{и оценки погрешности в них}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:grph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации ==&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21584</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21584"/>
		<updated>2017-01-19T12:26:01Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{/* Провести выборочную ортогонализацию по отношению},  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{   к сошедшимся векторам Ритца */}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \text{таких, что} \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{Вычислить собственные значения и собственные векторы}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{матрицы} \, \, T_{j} \, \text{и оценки погрешности в них}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:grph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации ==&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21581</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21581"/>
		<updated>2017-01-19T11:06:01Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: Содержимое страницы заменено на «{{Assignment}} Авторы: Хакимов А. С.  [https://ru.wikipedia.org/wiki/Участник:ArtyomKhakimov/Алгорит…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
[https://ru.wikipedia.org/wiki/Участник:ArtyomKhakimov/Алгоритм_Ланцоша_для_арифметики_с_плавающей_точкой_с_выборочной_ортогонализацией Статья временно находится на Википедии]&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21580</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21580"/>
		<updated>2017-01-19T10:41:36Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{/* Провести выборочную ортогонализацию по отношению},  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{   к сошедшимся векторам Ритца */}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \text{таких, что} \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{Вычислить собственные значения и собственные векторы}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{матрицы} \, \, T_{j} \, \text{и оценки погрешности в них}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:grph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации ==&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21575</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21575"/>
		<updated>2017-01-19T09:45:05Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
[https://ru.wikipedia.org/wiki/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9 Статья временно находится на Википедии]&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21574</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21574"/>
		<updated>2017-01-19T09:41:24Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignmenta}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     /* Провести выборочную ортогонализацию по отношению&lt;br /&gt;
     к сошедшимся векторам Ритца */&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \,&amp;lt;/math&amp;gt;таких, что&amp;lt;math \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{end for}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     Вычислить собственные значения и собственные векторы&lt;br /&gt;
     матрицы&amp;lt;math&amp;gt;\, \, T_{j} \, \,&amp;lt;/math&amp;gt;и оценки погрешности в них&lt;br /&gt;
 &amp;lt;math&amp;gt;\text{end for}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:grph.png|1024px|center|рис. 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;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21573</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21573"/>
		<updated>2017-01-19T09:17:18Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignmenta}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:grph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации ==&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21572</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21572"/>
		<updated>2017-01-19T09:00:46Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignmenta}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     /* Провести выборочную ортогонализацию по отношению&lt;br /&gt;
     к сошедшимся векторам Ритца */&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \,&amp;lt;/math&amp;gt;таких, что&amp;lt;math \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{end for}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     Вычислить собственные значения и собственные векторы&lt;br /&gt;
     матрицы&amp;lt;math&amp;gt;\, \, T_{j} \, \,&amp;lt;/math&amp;gt;и оценки погрешности в них&lt;br /&gt;
 &amp;lt;math&amp;gt;\text{end for}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21571</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21571"/>
		<updated>2017-01-19T08:57:04Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{/* Провести выборочную ортогонализацию по отношению},  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{   к сошедшимся векторам Ритца */}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \text{таких, что} \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{Вычислить собственные значения и собственные векторы}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{матрицы} \, \, T_{j} \, \text{и оценки погрешности в них}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для алгоритма Ланцоша можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор. Состоит из операций умножения вектора на число и сложения векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt; как скалярное произведение двух других векторов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;q_{j+1}=z/\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ортогонализация вектора Ланцоша с помощью скалярного произведения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Алгоритм &amp;quot;разделяй и властвуй&amp;quot; для вычисления собственных значений матрицы.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется в следующей последовательности:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;1.\, \, \beta_0 = 0,\; q_0 = 0&amp;lt;/math&amp;gt; #Инициализируем векторы&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;2.\, \, \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}&amp;lt;/math&amp;gt; #Вычисляем норму вектора начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;3.\, \, q_{1_{j}} = \frac{b_{j}}{\|b\|_2}, \; j = 1,\, \dots\,, n&amp;lt;/math&amp;gt; #Нормализуем вектор начального приближения.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором не более чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;. На &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-й итерации производятся следующие вычисления:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.1.\, \, z_j = \sum\limits_{m=1}^{n} a_{jm} q_{i_m}, \; j = 1,\,\dots\,, n&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;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.2.\, \, \alpha_i = \sum\limits_{j=1}^{n}q_{i_j} z_j&amp;lt;/math&amp;gt; #Получаем результат скалярного произведения векторов &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.3.\, \, z_j = z_j - \alpha_i q_{i_j} - \beta_{i-1}q_{i-1_j}, \, j = 1,\,\dots\,, n&amp;lt;/math&amp;gt; #Вычисляем линейную комбинацию векторов.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.\, \,&amp;lt;/math&amp;gt; Начинается цикл, в котором производится выборочная ортогонализация векторов Ланцоша&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.1.\, \,&amp;lt;/math&amp;gt; Вычисляется вектор Ритца &amp;lt;math&amp;gt;y_{i,k_d} = \sum\limits_{x=1}^{k} q_{x_d} v_{i_x}, \; d = 1,\,\dots\,, n,&amp;lt;/math&amp;gt;, где  &amp;lt;math&amp;gt;y_{i,k_d}&amp;lt;/math&amp;gt; -  &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;-я компонента вектора Ритца &amp;lt;math&amp;gt;y,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.2.\, \,&amp;lt;/math&amp;gt; Производится скалярное умножение &amp;lt;math&amp;gt;y_{i,k}^T&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt; z: \; \; \gamma = \sum\limits_{d=1}^{n}y_{i,k_d} z_d,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;4.4.3.\, \,&amp;lt;/math&amp;gt; Ищется новое собственное значение &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственный вектор &amp;lt;math&amp;gt; v_j &amp;lt;/math&amp;gt; для полученной матрицы &amp;lt;math&amp;gt; T_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.5.\, \, \beta_i = \|z\|_2 = \sqrt{\sum\limits_{j=1}^{n} z_j^2}&amp;lt;/math&amp;gt; #Считаем норму вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.6.&amp;lt;/math&amp;gt; Проверка равенства &amp;lt;math&amp;gt;\beta_i == 0&amp;lt;/math&amp;gt; # Если норма оказалась равной нулю, то завершаем итерации и переходим к вычислению собственных векторов и собственных значений полученной матрицы. В обратном случае, продолжаем выполнения итераций.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.7.\, \, q_{i+1_j} = \frac{z_j}{\beta_i}, \; j = 1,\, \dots \,, n&amp;lt;/math&amp;gt; #Нормируем вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;4.8.\,&amp;lt;/math&amp;gt; Если выполнили &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций, то завершаем выполнение итераций, переходим к следующему шагу. Иначе начинаем последующую итерацию цикла.&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;math&amp;gt;5.&amp;lt;/math&amp;gt; Вычисляем собственные значения и собственные вектора полученной матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt; операций сложения&lt;br /&gt;
* Вычисление скалярного произведения векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Оценка погрешностей - &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
* Выборочная переортогонализация - &amp;lt;math&amp;gt;O(2nj)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;O(2j(n-1) + n)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нормы вектора - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
* Вычисление нового столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения&lt;br /&gt;
&lt;br /&gt;
Итого на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;n^2 + n + 2n + kn + O(2nj) + n + n = n^2 + 5n + kn + O(2nj)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;n(n-1) + n-1 + 2n + O(2j(n-1) + n) + n-1 = n^2 + 3n + O(2j(n-1) + n) -2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итого за все время выполнения алгоритма:&lt;br /&gt;
&lt;br /&gt;
* Умножений: &amp;lt;math&amp;gt;kn^2 + 5kn + k^2n + O(k^2n + kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Сложений: &amp;lt;math&amp;gt;kn^2 + 3kn + O((k^2+k)(n-1)+kn) = kn^2 + 3kn + O(k^2(n-1)+2kn-k)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File:anczos_graph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
 Здесь:&lt;br /&gt;
 &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;  — перемножение матрицы и вектора,&lt;br /&gt;
 &amp;lt;math&amp;gt;\|x\|&amp;lt;/math&amp;gt;  — макрооперация взятия нормы,&lt;br /&gt;
 &amp;lt;math&amp;gt;\alpha x&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{F}&amp;lt;/math&amp;gt;  — операция &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;,&lt;br /&gt;
 &amp;lt;math&amp;gt;\mathsf{f}&amp;lt;/math&amp;gt;  — вычисление линейной комбинации векторов&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На каждой из итераций алгоритма можно получить выигрыш за счет распараллеливания следующих шагов:&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; - умножение матрицы размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом&lt;br /&gt;
* Вычисление коэффициента &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление нового значения вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: 2 яруса умножений длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (умножение вектора на число), 2 яруса вычитаний длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Выборочная переортогонализация: последовательно для всех &amp;lt;math&amp;gt;i \le k&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножений в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операций умножений в каждом, один ярус вычитаний размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt; - скалярное произведение векторов - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений, 1 операция умножения в каждом&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt; - деление вектора на число - один ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма по ширине ЯПФ - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Входные данные: вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем входных данных: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объем выходных данных: &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
= Программная реализация =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
Исследование алгоритма на масштабируемость производилось на суперкомпьютере [http://parallel.ru/cluster &amp;quot;Ломоносов&amp;quot;] с использованием технологии MPI. Для тестирования была выбрана [http://pastebin.com/SbNrh7nz вот эта] реализация алгоритма.&lt;br /&gt;
&lt;br /&gt;
Набор параметров, которые изменялись при тестировании:&lt;br /&gt;
*Число процессоров от 16 до 128.&lt;br /&gt;
*Размерность матрицы от 5000 до 50000 с шагом 5000.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;bottom&amp;quot; style=&amp;quot;caption-side: bottom&amp;quot; | Табл. 1. Результаты тестирования. В ячейках таблицы -- время работы алгоритма в секундах.&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; rowspan=&amp;quot;2&amp;quot; style=&amp;quot;border: none; background: none;&amp;quot;|&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot;| Число процессоров&lt;br /&gt;
|-&lt;br /&gt;
! 16 !! 32 !! 64 !! 128&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot;| Размер матрицы&lt;br /&gt;
! 5000&lt;br /&gt;
| 1,07 || 0,71 || 0,62 || 0,54&lt;br /&gt;
|-&lt;br /&gt;
! 10000&lt;br /&gt;
| 2,39 || 1,94 || 1,17 || 0,79&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 4,35 || 3,38 || 1,89 || 1,59&lt;br /&gt;
|-&lt;br /&gt;
! 20000&lt;br /&gt;
| 7,63 || 5,19 || 3,78 || 2,35&lt;br /&gt;
|-&lt;br /&gt;
! 15000&lt;br /&gt;
| 12,41 || 7,33 || 4,32 || 3,44&lt;br /&gt;
|-&lt;br /&gt;
! 30000&lt;br /&gt;
| 16,68 || 9,36 || 5,02 || 4,68&lt;br /&gt;
|-&lt;br /&gt;
! 35000&lt;br /&gt;
| 22,58 || 11,92 || 8,04 || 6,20&lt;br /&gt;
|-&lt;br /&gt;
! 40000&lt;br /&gt;
| 29,31 || 15,90 || 8,47 || 7,43&lt;br /&gt;
|-&lt;br /&gt;
! 45000&lt;br /&gt;
| 37,04 || 19,42 || 10,55 || 9,04&lt;br /&gt;
|-&lt;br /&gt;
! 50000&lt;br /&gt;
| 45,64 || 23,39 || 16,09 || 10,25&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:grph.png|1024px|center|рис. 1: Информационный граф]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации ==&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте Vienna VL&amp;lt;ref&amp;gt;https://github.com/viennacl/viennacl-dev&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте IETL&amp;lt;ref&amp;gt;http://www.comp-phys.org/software/ietl/lanczos.html&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Реализация в проекте ARPACK &amp;lt;ref&amp;gt;http://www.caam.rice.edu/software/ARPACK/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lanczos Plus Plus &amp;lt;ref&amp;gt;https://github.com/g1257/LanczosPlusPlus&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ED Lanczos &amp;lt;ref&amp;gt;https://github.com/henhans/ED_lanczos&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paralleles Rechnen 2 &amp;lt;ref&amp;gt;https://github.com/soneyworld/ParallelesRechnen2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuda-Arnoldi &amp;lt;ref&amp;gt;https://github.com/trantalaiho/Cuda-Arnoldi/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21569</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21569"/>
		<updated>2017-01-19T08:32:51Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz,&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{/* Провести выборочную ортогонализацию по отношению},  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{   к сошедшимся векторам Ритца */}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i \leqslant k, \text{таких, что} \, \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{k}\| \, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{Вычислить собственные значения и собственные векторы}&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\text{матрицы} \, \, T_{j} \, \text{и оценки погрешности в них}&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt;end \, for&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21568</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21568"/>
		<updated>2017-01-19T08:28:30Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, например, с помощью метода &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор, &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
* Ортогонализация по отношению к сошедшимся векторам  &amp;lt;math&amp;gt;z = z-(y^T_{i,k},z)y_{i,k} &amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i  = 1 \dots t&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21567</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21567"/>
		<updated>2017-01-19T08:26:40Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, - собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21566</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21566"/>
		<updated>2017-01-19T08:26:21Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На вход алгоритма подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; ,\, \;&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21551</id>
		<title>Участник:ArtyomKhakimov/Алгоритм Ланцоша для арифметики с плавающей точкой с выборочной ортогонализацией</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:ArtyomKhakimov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21551"/>
		<updated>2017-01-18T18:30:23Z</updated>

		<summary type="html">&lt;p&gt;ArtyomKhakimov: Новая страница: «Авторы: Хакимов А. С.  == Свойства и структура алгоритма == === Общее описание алгоритма ===  Ал…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: Хакимов А. С.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша служит для нахождения собственных значений и собственных векторов для больших разреженных матриц, к которым нельзя применить прямые методы из-за больших требований к памяти и времени. Он был опубликован Корнелием Ланцошем в 1950 году. Его эффективность обусловлена экономией памяти для хранения матриц и экономией вычислительных ресурсов. Алгоритм итерационный и использует степенной метод для поиска наибольших собственных значений и векторов матриц. Основной недостаток алгоритма заключается в накоплении ошибок округления, для решения которых появились методы поддержания ортогонализации т.н. векторов Ланцоша. Здесь мы рассмотрим выборочный метод поддержания ортогонализации, который существенно экономит процессорное время.&lt;br /&gt;
&lt;br /&gt;
На вход алгоритму подаётся  &amp;lt;math&amp;gt;A = A^T&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:ASymmetric}} &amp;lt;math&amp;gt; \, \;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
случайный вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, как первое приближение собственного вектора матрицы и &amp;lt;math&amp;gt;k &amp;lt;/math&amp;gt; - количество собственных значений и собственных векторов, которые требуется найти.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;Q_j = [q_1, q_2, \dots, q_j]&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n \times j&amp;lt;/math&amp;gt; строится на каждой итерации и состоит из ортонормированных векторов Ланцоша. А в качестве приближенных собственных значений берутся числа Ритца &amp;lt;math&amp;gt;\theta_i &amp;lt;/math&amp;gt;, т.е. собственные значения симметричной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j = Q^T_j A Q_j&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;j \times j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 \\&lt;br /&gt;
\beta_1 &amp;amp; \alpha_2 &amp;amp; \beta_2 \\&lt;br /&gt;
&amp;amp; \beta_2 &amp;amp; \ddots &amp;amp; \ddots \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{j-1} \\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \beta_{j-1} &amp;amp; \alpha_j&lt;br /&gt;
\end{pmatrix}\; (2).&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, векторы &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt; теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца &amp;lt;math&amp;gt;y_{i,j} = Q_j v_i &amp;lt;/math&amp;gt;, отвечающих сошедшимся числам Ритца &amp;lt;math&amp;gt; \theta_i &amp;lt;/math&amp;gt;. Поэтому чтобы построить &amp;lt;math&amp;gt;q_j &amp;lt;/math&amp;gt;, предлагается на каждом шаге следить за оценками погрешностей  &amp;lt;math&amp;gt;\beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_i(t) &amp;lt;/math&amp;gt; - &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-я компонента собственного вектора &amp;lt;math&amp;gt;v_i &amp;lt;/math&amp;gt;. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша &amp;lt;math&amp;gt;z &amp;lt;/math&amp;gt;. Величина &amp;lt;math&amp;gt;\beta_{t}|v_i(t)| &amp;lt;/math&amp;gt; считается малой, если она меньше, чем &amp;lt;math&amp;gt;\sqrt{\varepsilon}||T_{t}|| &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; - доступная машинная точность чисел.&lt;br /&gt;
&lt;br /&gt;
После следует вычисление собственных значений  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственных векторов &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной трехдиагональной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;, для чего существует, например, метод &amp;quot;разделяй и властвуй&amp;quot;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;math&amp;gt; q_{1} = b_{j}/\|b\|_2, \beta_0=0, q_0=0&amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;math&amp;gt; for\, j=1\,\, to\, \, k\, \, do:&amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=Aq_j,  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;\alpha_j=q_j^Tz, &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},  &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;   к сошедшимся векторам Ритца */,  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;t = j - 1,  &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;for\, i=1\,\, to\, \, t\, \, do: &amp;lt;/math&amp;gt;&lt;br /&gt;
         &amp;lt;math&amp;gt;if\,  \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{t}\| \, \,  then:&amp;lt;/math&amp;gt;&lt;br /&gt;
             &amp;lt;math&amp;gt;z = z-(y^T_{i,t},z)y_{i,t} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_{i,t} = Q_{t}v_i&amp;lt;/math&amp;gt; &lt;br /&gt;
     &amp;lt;math&amp;gt;\beta_{j}=\|z\|_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
     &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j}, &amp;lt;/math&amp;gt;&lt;br /&gt;
     Строим матрицу  &amp;lt;math&amp;gt; T_j&amp;lt;/math&amp;gt; (2), вычисляем собственные значения  &amp;lt;math&amp;gt; \theta_j &amp;lt;/math&amp;gt; и собственные векторы &amp;lt;math&amp;gt;v_j &amp;lt;/math&amp;gt; полученной матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>ArtyomKhakimov</name></author>
	</entry>
</feed>