<?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=Bashleon</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=Bashleon"/>
	<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/Bashleon"/>
	<updated>2026-10-22T22:08:10Z</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:VolkovNikita94&amp;diff=21485</id>
		<title>Обсуждение участника:VolkovNikita94</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:VolkovNikita94&amp;diff=21485"/>
		<updated>2016-12-21T16:23:47Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Последние замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.5 помимо текста программы нужно дать словесные пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:09, 27 октября 2016 (MSK)&lt;br /&gt;
* Подписи к рисунку в разделе 2.4 очень мелкие, почти неразличимые. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какая версия MKL, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK) &lt;br /&gt;
** Это замечание остаётся. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK) &lt;br /&gt;
* Рисунки в статье не пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
* На рис. в разделе 2.4 по-прежнему очень мелкие подписи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Исправления. ==&lt;br /&gt;
&lt;br /&gt;
Поправили замечания, прогнали на большом числе процессоров.&lt;br /&gt;
&lt;br /&gt;
Мой личный комментарий &amp;quot;вне задания&amp;quot;: есть довольно любопытная вещь, на которую стоит обратить внимание - небольшие скачки производительности, которые заметны на небольшом числе процессов для небольшого размера задачи. Для большего числа процессов эти скачки полностью не охватываются ( см. линию для 50 процессоров ), но, вероятно, имеют место быть. Какая-никакая, а &amp;quot;характерная особенность&amp;quot;, спасибо кэшам ? На 100 процессорах какое-то безумие :)&lt;br /&gt;
&lt;br /&gt;
* для стабильности можно просчитать задачу несколько раз во время одного запуска и сравнить времена (потом взять среднее или минимальное), отличия но 10% должны получиться. А если сравнивать времена различных запуском (когда очередь выделит узлы с другими номерами), то отличие в 30% тоже могут случиться. На заре установки Ломоносова знакомые исследовали это и составили карту скоростей обменов между физическими узлами, а потом даже одсуждали это с производителями. Вроде бы даже у них есть публикации... (ИНК) P.S. Если замеренное время счета получается меньше 1 сек., то лучше запустить задачу в цикле несколько раз подряд.&lt;br /&gt;
&lt;br /&gt;
== Новые замечания ==&lt;br /&gt;
* ваша работа дошла до проверяющего только вчера, так что извиняйте за задержку (ИНК)&lt;br /&gt;
* везде удрать * как символ математического умножения (в самом крайнем случае можно использовать \cdot)&lt;br /&gt;
* в формулах ну очень часто неверно набраны верхние индексы, состоящие более чем из одной буквы. Не забывайте фигурные скобки! (например, стоит набирать K^{-1})&lt;br /&gt;
* п.1.5 греческие буквы в обозначениях лучше сделать греческими, добавив \ (например, \alpha, \beta)&lt;br /&gt;
* п.1.6 поправить показатель степени &amp;quot;в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2.3})&amp;lt;/math&amp;gt; операций&amp;quot;&lt;br /&gt;
* п.1.7 &amp;quot;из статей от матрично-векторных операциях&amp;quot; (статьи в Алговики? добавить линк на них)&lt;br /&gt;
* п.1.8 &amp;quot;Ланцоща&amp;quot; --&amp;gt; &amp;quot;Ланцоша&amp;quot;, &amp;quot;классисифкации&amp;quot; --&amp;gt; &amp;quot;классификации&amp;quot; (безобразие! вы очень торопились при наборе... --&amp;gt; в режиме правки взять всю статью мышкой и поместить в Word чтобы он подчеркнул ошибочно набранные слова, после чего исправить все описки)&lt;br /&gt;
* п.2.4 &amp;quot;предметом отдельных статей ( QR-алгоритм, метод «Разделяй-и-властвуй», итерации Арнольди и.т.д. )&amp;quot; (линки на статьи)&lt;br /&gt;
* п.2.4 собственная реализация - это хорошо (MPI v.2.2? может стоит упомянуть это? И вообще сказать, что это гибридная MPI+OpenMP реализация. А сейчас модно писать код прямо с *.h файле без *.cpp? Хотя никому не мешает, реализация хорошая...)&lt;br /&gt;
* п.2.4 &amp;quot;Максимальная эффективность - 30.76%&amp;quot; малоинформативная фраза если не сказано на скольки ядрах, на одном или 800? Неплохо было бы для тех же данных привести пару-тройку графиков ускорения, для двух-трех размерностей матрицы.&lt;br /&gt;
* п.2.7 - замечательно, спасибо&lt;br /&gt;
* п.3 стоит занумеровать и сделать настоящие ссылки&lt;br /&gt;
&lt;br /&gt;
Основные замечания поправил, Леонид скоро зальёт графики ускорения и еще подправит 2.4&lt;br /&gt;
&lt;br /&gt;
PS: &amp;quot;модно...&amp;quot; - нет, не модно :) Просто а) программа маленькая и это не мешает, так что нет &amp;quot;против&amp;quot; и б) программа писалась в Visual Studio, где процедура компиляции настроена с отличиями от того, что происходит на кластере; в таком виде при переносе переписывать не нужно вообще ничего, так что есть &amp;quot;за&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
-Сделано. Добавил графики ускорения и пояснения к 2.4&lt;br /&gt;
&lt;br /&gt;
== Последние замечания ==&lt;br /&gt;
* Очень хорошо! При стремлении к соверщенству осталось сделать самую малость:&lt;br /&gt;
* в оставшихся местах (в том числе во врезке) убрать звездочку * в качестве символа умножения&lt;br /&gt;
* в п.2.4 конечно сбивает на осях количество узлов вместо количества нитей, непривычно прикидывать эффективность расчетов, но давайте оставим как есть, а для ясности напишем что-то вроде: для 50 проц. наблюдается эффективность более 50%&lt;br /&gt;
* в п.2.4 давайте три новых рисунка 4,5,6 объединим в один, тогда будет виднее повышение эффективности с ростом размера задачи, а графики пусть будут даны разным цветов&lt;br /&gt;
* P.S. ввиду приближения зачетной сессии я проставляю пометку принятости работы, но буду признателен если вы таки доделаете оставшиеся простые правки... (ИНК)&lt;br /&gt;
&lt;br /&gt;
Спасибо от меня и от Никиты !&lt;br /&gt;
&lt;br /&gt;
- Поправил.&lt;br /&gt;
- Добавил в подпись к графику.&lt;br /&gt;
- Добавил 4-ый график со сравнительным анализом.&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21484</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21484"/>
		<updated>2016-12-21T16:20:58Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Konshin}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + kn&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + kn ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + kn&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа MPI процессов (по 4 OpenMP нити каждый). Потенциальная максимальная производительность, которая может быть достигнута - 13.6 GFLOPS на 1 MPI процесс. Тогда, например, эффективность вычислений на 100 процессах при размере задачи 4000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;4000 составляет приблизительно 14.33%]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - ~30% (получается на 2-8 процессов при ~640000 ячеек матрицы на процесс; в случае 8 процессов это входная матрица 1600&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;1600). &lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[[File:Speedup_2000.png|600px|thumb|center|Рис. 4: Ускорение для размера задачи 2000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;2000]]&lt;br /&gt;
[[File:Speedup_3000.png|600px|thumb|center|Рис. 5: Ускорение для размера задачи 3000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;3000]]&lt;br /&gt;
[[File:Speedup_4000.png|600px|thumb|center|Рис. 6: Ускорение для размера задачи 4000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;4000]]&lt;br /&gt;
[[File:Speedup total.png|600px|thumb|center|Рис. 6: Сравнение ускорения для различных размеров задачи]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21483</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21483"/>
		<updated>2016-12-21T16:18:35Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Konshin}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + kn&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + kn ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + kn&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа MPI процессов (по 4 OpenMP нити каждый). Потенциальная максимальная производительность, которая может быть достигнута - 13.6 GFLOPS на 1 MPI процесс. Тогда, например, эффективность вычислений на 200 процессах при размере задачи 4000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;4000 составляет]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - ~30% (получается на 2-8 процессов при ~640000 ячеек матрицы на процесс; в случае 8 процессов это входная матрица 1600&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;1600). &lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[[File:Speedup_2000.png|600px|thumb|center|Рис. 4: Ускорение для размера задачи 2000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;2000]]&lt;br /&gt;
[[File:Speedup_3000.png|600px|thumb|center|Рис. 5: Ускорение для размера задачи 3000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;3000]]&lt;br /&gt;
[[File:Speedup_4000.png|600px|thumb|center|Рис. 6: Ускорение для размера задачи 4000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;4000]]&lt;br /&gt;
[[File:Speedup total.png|600px|thumb|center|Рис. 6: Сравнение ускорения для различных размеров задачи]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21482</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21482"/>
		<updated>2016-12-21T16:09:52Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Konshin}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + kn&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + kn&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + kn ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + kn&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - ~30% (получается на 2-8 процессов при ~640000 ячеек матрицы на процесс; в случае 8 процессов это входная матрица 1600&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;1600). &lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[[File:Speedup_2000.png|600px|thumb|center|Рис. 4: Ускорение для размера задачи 2000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;2000]]&lt;br /&gt;
[[File:Speedup_3000.png|600px|thumb|center|Рис. 5: Ускорение для размера задачи 3000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;3000]]&lt;br /&gt;
[[File:Speedup_4000.png|600px|thumb|center|Рис. 6: Ускорение для размера задачи 4000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;4000]]&lt;br /&gt;
[[File:Speedup total.png|600px|thumb|center|Рис. 6: Сравнение ускорения для различных размеров задачи]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94&amp;diff=21111</id>
		<title>Обсуждение участника:VolkovNikita94</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:VolkovNikita94&amp;diff=21111"/>
		<updated>2016-12-17T07:46:49Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Новые замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.5 помимо текста программы нужно дать словесные пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:09, 27 октября 2016 (MSK)&lt;br /&gt;
* Подписи к рисунку в разделе 2.4 очень мелкие, почти неразличимые. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какая версия MKL, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK) &lt;br /&gt;
** Это замечание остаётся. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK) &lt;br /&gt;
* Рисунки в статье не пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
* На рис. в разделе 2.4 по-прежнему очень мелкие подписи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Исправления. ==&lt;br /&gt;
&lt;br /&gt;
Поправили замечания, прогнали на большом числе процессоров.&lt;br /&gt;
&lt;br /&gt;
Мой личный комментарий &amp;quot;вне задания&amp;quot;: есть довольно любопытная вещь, на которую стоит обратить внимание - небольшие скачки производительности, которые заметны на небольшом числе процессов для небольшого размера задачи. Для большего числа процессов эти скачки полностью не охватываются ( см. линию для 50 процессоров ), но, вероятно, имеют место быть. Какая-никакая, а &amp;quot;характерная особенность&amp;quot;, спасибо кэшам ? На 100 процессорах какое-то безумие :)&lt;br /&gt;
&lt;br /&gt;
* для стабильности можно просчитать задачу несколько раз во время одного запуска и сравнить времена (потом взять среднее или минимальное), отличия но 10% должны получиться. А если сравнивать времена различных запуском (когда очередь выделит узлы с другими номерами), то отличие в 30% тоже могут случиться. На заре установки Ломоносова знакомые исследовали это и составили карту скоростей обменов между физическими узлами, а потом даже одсуждали это с производителями. Вроде бы даже у них есть публикации... (ИНК) P.S. Если замеренное время счета получается меньше 1 сек., то лучше запустить задачу в цикле несколько раз подряд.&lt;br /&gt;
&lt;br /&gt;
== Новые замечания ==&lt;br /&gt;
* ваша работа дошла до проверяющего только вчера, так что извиняйте за задержку (ИНК)&lt;br /&gt;
* везде удрать * как символ математического умножения (в самом крайнем случае можно использовать \cdot)&lt;br /&gt;
* в формулах ну очень часто неверно набраны верхние индексы, состоящие более чем из одной буквы. Не забывайте фигурные скобки! (например, стоит набирать K^{-1})&lt;br /&gt;
* п.1.5 греческие буквы в обозначениях лучше сделать греческими, добавив \ (например, \alpha, \beta)&lt;br /&gt;
* п.1.6 поправить показатель степени &amp;quot;в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2.3})&amp;lt;/math&amp;gt; операций&amp;quot;&lt;br /&gt;
* п.1.7 &amp;quot;из статей от матрично-векторных операциях&amp;quot; (статьи в Алговики? добавить линк на них)&lt;br /&gt;
* п.1.8 &amp;quot;Ланцоща&amp;quot; --&amp;gt; &amp;quot;Ланцоша&amp;quot;, &amp;quot;классисифкации&amp;quot; --&amp;gt; &amp;quot;классификации&amp;quot; (безобразие! вы очень торопились при наборе... --&amp;gt; в режиме правки взять всю статью мышкой и поместить в Word чтобы он подчеркнул ошибочно набранные слова, после чего исправить все описки)&lt;br /&gt;
* п.2.4 &amp;quot;предметом отдельных статей ( QR-алгоритм, метод «Разделяй-и-властвуй», итерации Арнольди и.т.д. )&amp;quot; (линки на статьи)&lt;br /&gt;
* п.2.4 собственная реализация - это хорошо (MPI v.2.2? может стоит упомянуть это? И вообще сказать, что это гибридная MPI+OpenMP реализация. А сейчас модно писать код прямо с *.h файле без *.cpp? Хотя никому не мешает, реализация хорошая...)&lt;br /&gt;
* п.2.4 &amp;quot;Максимальная эффективность - 30.76%&amp;quot; малоинформативная фраза если не сказано на скольки ядрах, на одном или 800? Неплохо было бы для тех же данных привести пару-тройку графиков ускорения, для двух-трех размерностей матрицы.&lt;br /&gt;
* п.2.7 - замечательно, спасибо&lt;br /&gt;
* п.3 стоит занумеровать и сделать настоящие ссылки&lt;br /&gt;
&lt;br /&gt;
Основные замечания поправил, Леонид скоро зальёт графики ускорения и еще подправит 2.4&lt;br /&gt;
&lt;br /&gt;
PS: &amp;quot;модно...&amp;quot; - нет, не модно :) Просто а) программа маленькая и это не мешает, так что нет &amp;quot;против&amp;quot; и б) программа писалась в Visual Studio, где процедура компиляции настроена с отличиями от того, что происходит на кластере; в таком виде при переносе переписывать не нужно вообще ничего, так что есть &amp;quot;за&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
-Сделано. Добавил графики ускорения и пояснения к 2.4&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21110</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21110"/>
		<updated>2016-12-17T07:45:19Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(k * n^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + k * n&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + k * n&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + k * n ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + k * n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - ~30% (получается на 2-8 процессов при ~640000 ячеек матрицы на процесс; в случае 8 процессов это входная матрица 1600&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;1600). &lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[[File:Speedup_2000.png|600px|thumb|center|Рис. 4: Ускорение для размера задачи 2000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;2000]]&lt;br /&gt;
[[File:Speedup_3000.png|600px|thumb|center|Рис. 5: Ускорение для размера задачи 3000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;3000]]&lt;br /&gt;
[[File:Speedup_4000.png|600px|thumb|center|Рис. 6: Ускорение для размера задачи 4000&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;4000]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21109</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21109"/>
		<updated>2016-12-17T07:44:37Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(k * n^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + k * n&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + k * n&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + k * n ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + k * n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - ~30% (получается на 2-8 процессов при ~640000 ячеек матрицы на процесс; в случае 8 процессов это входная матрица 1600&amp;lt;math&amp;gt;{\cdot}&amp;lt;/math&amp;gt;1600). &lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[[File:Speedup_2000.png|600px|thumb|center|Рис. 4: Ускорение для размера задачи 2000х2000]]&lt;br /&gt;
[[File:Speedup_3000.png|600px|thumb|center|Рис. 5: Ускорение для размера задачи 3000х3000]]&lt;br /&gt;
[[File:Speedup_4000.png|600px|thumb|center|Рис. 6: Ускорение для размера задачи 4000х4000]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94&amp;diff=21108</id>
		<title>Обсуждение участника:VolkovNikita94</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:VolkovNikita94&amp;diff=21108"/>
		<updated>2016-12-17T07:31:03Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Новые замечания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.5 помимо текста программы нужно дать словесные пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 16:09, 27 октября 2016 (MSK)&lt;br /&gt;
* Подписи к рисунку в разделе 2.4 очень мелкие, почти неразличимые. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какая версия MKL, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK) &lt;br /&gt;
** Это замечание остаётся. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не приведена использованная в экспериментах реализация алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:06, 16 ноября 2016 (MSK) &lt;br /&gt;
* Рисунки в статье не пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
* На рис. в разделе 2.4 по-прежнему очень мелкие подписи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 13:56, 21 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Исправления. ==&lt;br /&gt;
&lt;br /&gt;
Поправили замечания, прогнали на большом числе процессоров.&lt;br /&gt;
&lt;br /&gt;
Мой личный комментарий &amp;quot;вне задания&amp;quot;: есть довольно любопытная вещь, на которую стоит обратить внимание - небольшие скачки производительности, которые заметны на небольшом числе процессов для небольшого размера задачи. Для большего числа процессов эти скачки полностью не охватываются ( см. линию для 50 процессоров ), но, вероятно, имеют место быть. Какая-никакая, а &amp;quot;характерная особенность&amp;quot;, спасибо кэшам ? На 100 процессорах какое-то безумие :)&lt;br /&gt;
&lt;br /&gt;
* для стабильности можно просчитать задачу несколько раз во время одного запуска и сравнить времена (потом взять среднее или минимальное), отличия но 10% должны получиться. А если сравнивать времена различных запуском (когда очередь выделит узлы с другими номерами), то отличие в 30% тоже могут случиться. На заре установки Ломоносова знакомые исследовали это и составили карту скоростей обменов между физическими узлами, а потом даже одсуждали это с производителями. Вроде бы даже у них есть публикации... (ИНК) P.S. Если замеренное время счета получается меньше 1 сек., то лучше запустить задачу в цикле несколько раз подряд.&lt;br /&gt;
&lt;br /&gt;
== Новые замечания ==&lt;br /&gt;
* ваша работа дошла до проверяющего только вчера, так что извиняйте за задержку (ИНК)&lt;br /&gt;
* везде удрать * как символ математического умножения (в самом крайнем случае можно использовать \cdot)&lt;br /&gt;
* в формулах ну очень часто неверно набраны верхние индексы, состоящие более чем из одной буквы. Не забывайте фигурные скобки! (например, стоит набирать K^{-1})&lt;br /&gt;
* п.1.5 греческие буквы в обозначениях лучше сделать греческими, добавив \ (например, \alpha, \beta)&lt;br /&gt;
* п.1.6 поправить показатель степени &amp;quot;в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2.3})&amp;lt;/math&amp;gt; операций&amp;quot;&lt;br /&gt;
* п.1.7 &amp;quot;из статей от матрично-векторных операциях&amp;quot; (статьи в Алговики? добавить линк на них)&lt;br /&gt;
* п.1.8 &amp;quot;Ланцоща&amp;quot; --&amp;gt; &amp;quot;Ланцоша&amp;quot;, &amp;quot;классисифкации&amp;quot; --&amp;gt; &amp;quot;классификации&amp;quot; (безобразие! вы очень торопились при наборе... --&amp;gt; в режиме правки взять всю статью мышкой и поместить в Word чтобы он подчеркнул ошибочно набранные слова, после чего исправить все описки)&lt;br /&gt;
* п.2.4 &amp;quot;предметом отдельных статей ( QR-алгоритм, метод «Разделяй-и-властвуй», итерации Арнольди и.т.д. )&amp;quot; (линки на статьи)&lt;br /&gt;
* п.2.4 собственная реализация - это хорошо (MPI v.2.2? может стоит упомянуть это? И вообще сказать, что это гибридная MPI+OpenMP реализация. А сейчас модно писать код прямо с *.h файле без *.cpp? Хотя никому не мешает, реализация хорошая...)&lt;br /&gt;
* п.2.4 &amp;quot;Максимальная эффективность - 30.76%&amp;quot; малоинформативная фраза если не сказано на скольки ядрах, на одном или 800? Неплохо было бы для тех же данных привести пару-тройку графиков ускорения, для двух-трех размерностей матрицы.&lt;br /&gt;
* п.2.7 - замечательно, спасибо&lt;br /&gt;
* п.3 стоит занумеровать и сделать настоящие ссылки&lt;br /&gt;
&lt;br /&gt;
Основные замечания поправил, Леонид скоро зальёт графики ускорения и еще подправит 2.4&lt;br /&gt;
-Сделано&lt;br /&gt;
&lt;br /&gt;
PS: &amp;quot;модно...&amp;quot; - нет, не модно :) Просто а) программа маленькая и это не мешает, так что нет &amp;quot;против&amp;quot; и б) программа писалась в Visual Studio, где процедура компиляции настроена с отличиями от того, что происходит на кластере; в таком виде при переносе переписывать не нужно вообще ничего, так что есть &amp;quot;за&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21107</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21107"/>
		<updated>2016-12-17T07:30:10Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(k * n^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + k * n&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + k * n&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + k * n ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + k * n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - 30.76%&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[[File:Speedup_2000.png|600px|thumb|center|Рис. 4: Ускорение для размера задачи 2000х2000]]&lt;br /&gt;
[[File:Speedup_3000.png|600px|thumb|center|Рис. 5: Ускорение для размера задачи 3000х3000]]&lt;br /&gt;
[[File:Speedup_4000.png|600px|thumb|center|Рис. 6: Ускорение для размера задачи 4000х4000]]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21106</id>
		<title>Участник:VolkovNikita94/Алгоритм Ланцоша для точной арифметики (без переортогонализации)</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:VolkovNikita94/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_(%D0%B1%D0%B5%D0%B7_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8)&amp;diff=21106"/>
		<updated>2016-12-17T07:28:26Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы статьи :&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:VolkovNikita94 &amp;lt;b&amp;gt;Волков Н. И. ( группа 623 )&amp;lt;/b&amp;gt;] - разделы 1.1 , 1.3 , 1.7 , 1.9 , 2.7&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Bashleon &amp;lt;b&amp;gt;Башлыков. Л. А. ( группа 616 )&amp;lt;/b&amp;gt;] - разделы 1.2 , 1.4&amp;lt;br/&amp;gt;&lt;br /&gt;
Совместно: 1.5 , 1.6 , 1.8 , 1.10 , 2.4&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша для точной арифметики ( без переортогонализации )&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2) + O(k^3)&amp;lt;/math&amp;gt; - на одну итерацию. &amp;lt;math&amp;gt;O(k * n^2)&amp;lt;/math&amp;gt; - суммарно.&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(k * n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;, при экономии памяти  сокращается до &amp;lt;math&amp;gt;\frac{n(n - 1)}{2} + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, если нужны собственные векторы, то &amp;lt;math&amp;gt;k + k * n&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;k&amp;lt;/math&amp;gt; собственных значений симметричной матрицы произвольного размера путём вычисления их приближений. Суть метода заключается в итеративном построении специальной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, а затем вычислении её собственных значений и собственных векторов. Общее описание алгоритма можно найти, например, в книге &amp;lt;ref&amp;gt;Деммель Дж. Вычислительная линейная алгебра. Теория и приложения - М.: Мир, 2001. [http://www.bookvoed.ru/book?id=5252274 Ознакомиться]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Здесь мы рассмотрим упрощенный вариант алгоритма Ланцоша, который подразумевает отсутствие влияния ошибок округления на вычислительный процесс. На практике используются модификации алгоритма Ланцоша, обладающие устойчивостью и без этого допущения ( например, алгоритм Ланцоша с полной переортогонализацией ).&lt;br /&gt;
&lt;br /&gt;
===Математическое описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;Ax = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = Ab&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^{2}b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^{(n - 1)}b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;AK = [Ay_{1},...,Ay_{n - 1}, Ay_{n}] = [y_{2},...,y_{n},A^n{y_{1}}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^{-1}A^{ny_{1}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;AK&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;AK = K[e_{2},e_{3},...,e_{n},-c] = KC&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^{-1}AK = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;Ab&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^{(k - 1)}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;Ax = b &amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;Ax = {\lambda}x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = QQ&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^{-1}AK = (R^{-1}Q^{T})A(QR) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^{T}AQ = RCR^{-1} = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^{-1}&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;AQ_{j} = \beta_{j - 1}q_{j - 1} + \alpha_{j}q_{j} + \beta_{j}q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;AQ = QT&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^{T}Aq_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^{T}&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;nk&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n(n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^{T}AQ = [Q_{k},Q_{u}]^{T}A[Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^{T}AQ_{1}) / (Q_{1}^{T}Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^{T}AQ&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k}V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||AQ_{k} - Q_{k}R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||AP_{k} - P_{k}D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;nk &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k^2&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k}V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V{\lambda}V^{T}&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A(Q_{k}v_{i}) - (Q_{k}v_{i})\theta_{i}||_{2} = ||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku}v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k}|v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k}v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2}\sin{2\theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^{T}AQ_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Вычислительное ядро алгоритма===&lt;br /&gt;
Вычислительное ядро алгоритма Ланцоща состоит в получении на каждой итерации очередного промежуточного вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, получаемого путём умножения исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор Ланцоша &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt;, полученный на предыдущей итерации.&lt;br /&gt;
&lt;br /&gt;
Также при значениях &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, сопоставимых с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, процедура вычисления собственных значений и собственных векторов симметричной трёхдиагональной матрицы по некоторому выбранному алгоритму подразумевает значительный объём расчётов и может считаться вычислительным ядром. Однако на практике метод используется прежде всего при малых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&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;j&amp;lt;/math&amp;gt; ортонормированных векторов Ланцоша и матрица &amp;lt;math&amp;gt;T_{j} =  Q^T_{j}AQ_{j}&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = Az&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^{T}z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;br /&gt;
&lt;br /&gt;
===Схема последовательной реализации алгоритма===&lt;br /&gt;
&lt;br /&gt;
Алгоритм итерационный, на каждой итерации выполняется вычисление очередного столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, а также вычисление элементов очередной пары ( диагонального и околодиагонального ) элементов матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с использованием значений столбца матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, полученного на предыдущей итерации и значения околодиагонального элемента матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; с предыдущей итерации. Вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; носит вспомогательный характер. Коэффициенты &amp;lt;math&amp;gt;\alpha_{j}&amp;lt;/math&amp;gt; соответствуют диагональным элементам матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, коэффициенты &amp;lt;math&amp;gt;\beta_{j}&amp;lt;/math&amp;gt; – наддиагональным и поддиагональным элементам той же матрицы. Далее приводится пример псевдокода. По окончании итераций вычислеяются собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что в псевдокоде не отражается ( т.к. это отдельный алгоритм ).&lt;br /&gt;
&lt;br /&gt;
 Вычислить столбец q1 матрицы Qk q1 = b / ||b||&lt;br /&gt;
 q0 - нулевой вектор&lt;br /&gt;
 beta_0 = 0&lt;br /&gt;
 foreach (j = 1 .. k ) &lt;br /&gt;
 {&lt;br /&gt;
      z = A * qj&lt;br /&gt;
      alpha_j = qj * z &lt;br /&gt;
      z = z – alpha_j * qj – beta_(j-1) * q(j – 1)&lt;br /&gt;
      beta_j = ||z||&lt;br /&gt;
      if ( beta_j == 0 )&lt;br /&gt;
      {&lt;br /&gt;
          break // Все ненулевые собственные значения найдены. Выход может быть досрочным.&lt;br /&gt;
      }&lt;br /&gt;
      else &lt;br /&gt;
      {&lt;br /&gt;
          q(j + 1) = z/beta_j&lt;br /&gt;
      }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 Вычислить собственные значения и собственные векторы симметричной трехдиагональной матрицы Tj наиболее подходящим методом.&lt;br /&gt;
 Полученный вектор Lj есть искомые собственные значения.&lt;br /&gt;
&lt;br /&gt;
===Последовательная сложность алгоритма===&lt;br /&gt;
Все дальнейшие выкладки верны для наиболее быстрого последовательного варианта выполнения указываемых операций. &lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и наоборот требует по &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и сложений.&lt;br /&gt;
*Перемножение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений.&amp;lt;br/&amp;gt;&lt;br /&gt;
*Поэлементное сложение векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*Умножение вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на число требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
*Нахождение квадратичной нормы вектора длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений и сложений, а также одну операцию извлечения квадратного корня.&lt;br /&gt;
*Вычисление собственных значений матрицы порядка &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; QR-алгоритмом требует &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt; операций, вычисление также и собственных векторов требует примерно &amp;lt;math&amp;gt;6k ^ 3&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;O(k^3)&amp;lt;/math&amp;gt; операций; при использовании метода «Разделяй-и-властвуй» для вычисления собственных значений и векторов аналогичной матрицы в среднем затрачивается &amp;lt;math&amp;gt;O(k^{2})&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, для выполнения одной итерации метода Ланцоща требуется 1 операция вычисления квадратного корня, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; умножений, а также по &amp;lt;math&amp;gt;n ^ 2 + n + 2n + n&amp;lt;/math&amp;gt; сложений и умножений, а также суммарно &amp;lt;math&amp;gt;O(k ^ 3)&amp;lt;/math&amp;gt;  операций, требуемых для поиска собственных значений и собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. То есть последовательная сложность алгоритма Ланцоша составляет &amp;lt;math&amp;gt;O(n ^ 2) + O(k ^ 3)&amp;lt;/math&amp;gt;. Это, очевидно, меньше, чем &amp;lt;math&amp;gt;O(n ^ 3)&amp;lt;/math&amp;gt; операций, требуемых в алгоритмах вычисления всех собственных значений произвольных симметричных матриц, в чём и заключается выгода метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
===Информационный граф===&lt;br /&gt;
&lt;br /&gt;
Информационный граф алгоритма, определяемый в &amp;lt;ref&amp;gt;Параллельные вычисления (Воеводин В.В., Воеводин Вл.В.) - Спб, изд-во &amp;quot;БХВ-Петербург&amp;quot;, 2002 [https://parallel.ru/news/bhv_parallelcomputing.html Ознакомиться]&amp;lt;/ref&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\log{n}&amp;lt;/math&amp;gt; потоков, чего можно было бы достичь, используя суммирование сдваиванием. Это допущение аналогично допущению из статьи [https://algowiki-project.org/ru/%D0%A3%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%BE%D1%82%D0%BD%D0%BE%D0%B9_%D0%BD%D0%B5%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BD%D0%B0_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80_(%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B2%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82) Умножение матрицы на вектор] и  Это же допущение будет использовано и при оценке ресурса параллелизма алгоритма. Приводится граф без отображения входных и выходных данных.&lt;br /&gt;
&lt;br /&gt;
[[File:Volkov Lanzcos 1.png|600px|thumb|center|Рис. 1: Граф алгоритма для матрицы А порядка 5 и k = 3. Op - одна итерация алгоритма, Eigen - процедура вычисления собственных значений]]&lt;br /&gt;
[[File:Volkov Lanzcos 2.png|600px|thumb|center|Рис. 2: Внутренний граф итерации алгоритма для матрицы A порядка 5. Vector sum - нахождение суммы элементов вектора-&amp;lt;b&amp;gt;поэлементного произведения&amp;lt;/b&amp;gt; векторов z и qj. Op - вычитания из z векторов qj и q(j - 1), домноженных на коэффициенты.  Norm - вычисление нормы вектора z.]]&lt;br /&gt;
&lt;br /&gt;
===Ресурс параллелизма алгоритма===&lt;br /&gt;
Каждая итерация алгоритма Ланцоша выполняется строго последовательно. Однако внутри итерации возможно распараллеливание алгоритма.&lt;br /&gt;
&lt;br /&gt;
*Умножение квадратной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
*Все остальные операции в рамках одной итерации, ведущие к вычислению матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; выполняются строго последовательно. При этом вычисление значений векторов может быть выполнено за 1 ярус умножений / сложений, а вычисление чисел - за &amp;lt;math&amp;gt;\log{n}&amp;lt;/math&amp;gt; таких операций.&lt;br /&gt;
*Ресурс параллелизма алгоритма вычисления собственных значений зависит от используемого алгоритма и рассматривается в соответствующей статье.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по ширине ЯПФ алгоритм обладает &amp;lt;i&amp;gt;линейной&amp;lt;/i&amp;gt; сложностью. В случае классификации по высоте ЯПФ алгоритм также имеет &amp;lt;i&amp;gt;линейную&amp;lt;/i&amp;gt; сложность.&lt;br /&gt;
&lt;br /&gt;
===Входные и выходные данные алгоритма===&lt;br /&gt;
&amp;lt;b&amp;gt;Входные данные: &amp;lt;/b&amp;gt; квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; ), вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, число &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём входных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Выходные данные:&amp;lt;/b&amp;gt; вектор &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, матрица &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; ( элементы &amp;lt;math&amp;gt;e_{pq}&amp;lt;/math&amp;gt; )&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Объём выходных данных:&amp;lt;/b&amp;gt; &amp;lt;math&amp;gt;k + k * n&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Свойства алгоритма===&lt;br /&gt;
В случае неограниченности ресурсов соотношение последовательной и параллельной сложности алгоритма Ланцоща по сумме всех итераций представляет собой &amp;lt;math&amp;gt;k ^ 3 + k * n ^ 2&amp;lt;/math&amp;gt; к &amp;lt;math&amp;gt;X + k * n&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - параллельная сложность алгоритма, используемого для вычисления собственных значений. В случае использования метода вычисления собственных значений с линейной сложностью при классисифкации по высоте ЯПФ это соотношение будет равно &amp;lt;math&amp;gt;(k ^ 2 + n ^ 2) / (k  + n)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша не является полностью детерминированным в том смысле, что возможно выполнение числа итераций алгоритма, меньшего, чем заданное ( из-за того, что вычислены все ненулевые собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ). &lt;br /&gt;
&lt;br /&gt;
Важное свойство метода Ланцоша состоит в том, что первыми в матрице &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; появляются собственные значения с максимальной величиной по модулю. Таким образом, метод особенно хорошо подходит для вычисления собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, находящихся на краях её спектра.&lt;br /&gt;
&lt;br /&gt;
==Программная реализация алгоритма==&lt;br /&gt;
===Особенности реализации последователього алгоритма===&lt;br /&gt;
===Локальность данных и вычислений===&lt;br /&gt;
===Возможные способы и особенности параллельной реализации алгоритма===&lt;br /&gt;
===Масштабируемость алгоритма и его реализации===&lt;br /&gt;
&lt;br /&gt;
Для проверки масштабируемости алгоритма из реализации была исключена непосредственно задача поиска собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; на каждой итерации, так как это является предметом отдельных статей ([https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:F-morozov/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(4) QR-алгоритм], метод [https://algowiki-project.org/ru/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%C2%AB%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8F%D0%B9_%D0%B8_%D0%B2%D0%BB%D0%B0%D1%81%D1%82%D0%B2%D1%83%D0%B9%C2%BB_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D1%82%D1%80%D0%B5%D1%85%D0%B4%D0%B8%D0%B0%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B «Разделяй-и-властвуй»], [https://en.wikipedia.org/wiki/Arnoldi_iteration итерации Арнольди]  и.т.д.). Таким образом, проверяемая на масштабируемость задача сводится к итерационному вычислению коэффициентов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; в рассматриваемой реализации хранится построчно и построчно же разделяется между процессорами. Также в целях исключения влияния недетерминированности алгоритма этот процесс изменен так, что при вычислении всех ненулевых собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; работа алгоритма продолжается над фиктивными данными, пока не будет завершено заранее заданное число итераций. При этом в реализации используется OpenMP для распараллеливания в пределах одного узла. &lt;br /&gt;
&lt;br /&gt;
[[File:Ланцош_масштабы.png|1000px|thumb|center|Рис. 3: Производительность алгоритма для указанных значений размера задачи и числа процессов]]&lt;br /&gt;
&lt;br /&gt;
Набор изменяемых параметров запуска реализации алгоритма и границы значений параметров алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Число MPI процессов [1 : 200]&lt;br /&gt;
*Число OpenMP нитей [1 : 4] (Запуск с 1 OpenMP нитью производился только для 1 MPI процесса, ускорение замерялось относительно этого запуска).&lt;br /&gt;
*Размерность матрицы [400 : 4000]&lt;br /&gt;
&lt;br /&gt;
Эффективность выполнения реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
*Минимальная эффективность - &amp;lt;1% (неактуально, так как в исследовании достигнут предел масштабируемости алгоритма).&lt;br /&gt;
*Максимальная эффективность - 30.76%&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости:&lt;br /&gt;
&lt;br /&gt;
*По числу процессов - при увеличении числа процессов эффективность уменьшается на всей области рассмотренных значений, но не слишком интенсивно. Это связано с небольшим объёмом пересылок данных, реализованных через достаточно эффективные операции редукции.&lt;br /&gt;
*По размеру задачи - при увеличении размера задачи эффективность вычислений вначале кратковременно возрастает, но затем начинает относительно равномерно убывать на всей рассматриваемой области.&lt;br /&gt;
*По двум направлениям - при рассмотрении увеличения, как вычислительной сложности, так и числа процессов по всей рассмотренной области значений наибольшая эффективность наблюдается при соответствии числа процессов и размера задачи. По этой &amp;quot;диагонали&amp;quot; эффективность вначале кратковременно возрастает, затем начинает убывать.&lt;br /&gt;
&lt;br /&gt;
Интересно, что для разного числа процессоров положительные скачки производительности (зачастую - довольно заметные) имеют место на разных объёмах входных данных.&lt;br /&gt;
&lt;br /&gt;
Далее приводятся графики ускорения программы для разных объёмов входных данных. Ускорение считалось относительно варианта с 1 MPI процессом без дальнейшнего распараллеливания посредством OpenMP. На оси абсцисс отмечается число MPI процессов, число OpenMP нитей во всех случаях равно четырём.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/VolkovNikita94/Lanczos Используемая реализация алгоритма]&lt;br /&gt;
Реализация алгоритма гибридная, использует как MPI версии 2.2 (использование MPI_IN_PLACE), так и OpenMP. Указанный код компилировался с помощью компилятора IBM (mpixlcxx_r) с опцией -qsmp=omp (она включает в себя оптимизацию -O2). Реализация алгоритма полностью собственная и не использует встроенные библиотеки. Каждая &amp;quot;quadcore node&amp;quot; - это 1 узел системы BG/P, содержащий 4 микропроцессорных ядра IBM PowerPC 450 c суммарной пиковой производительностью 13.6 GFLOPS на узел и 2 GB общей памяти с пропускной способностью 13.6 GB/sec.&lt;br /&gt;
&lt;br /&gt;
===Динамические характеристики и эффективность реализации алгоритма===&lt;br /&gt;
===Выводы для классов архитектур===&lt;br /&gt;
===Существующие реализации алгоритма===&lt;br /&gt;
Подробный анализ алгоритмов нахождения собственных значений, включая алгоритм Ланцоша, был проведен в &amp;lt;ref&amp;gt;A Survey of Software for Sparse Eigenvalue Problems - V. Hernandez, J. E. Roman, A. Tomas, V. Vidal [http://slepc.upv.es/documentation/reports/str6.pdf Ознакомиться]&amp;lt;/ref&amp;gt;. Существует несколько как последовательных, так и параллельных реализаций алгоритма Ланцоша, включенных в программные библиотеки для поиска собственных значений матриц. Свойства этих реализаций можно увидеть в таблицах ниже. Первая таблица — относительно недавние реализации, вторая - «музейные экспонаты». Следует уделить особенное внимание столбцам «тип метода» и «параллелизация». В первом из них значение только N соответствует описанному варианту без реортогонализации, F – полной реортогонализации, P – частичной реортогонализации, S – выборочной реортогонализации. Во втором значние «none» соответствует отсутствию параллельной реализации, M – параллельной реализации посредством MPI, O – параллельной реализации посредством OpenMP. Их приведение целесообразно, так как на практике алгоритм Ланцоша без переортогонализации неустойчив. Также указываются библиотеки, в которых реализованы более глубокие модификации метода Ланцоша, с указанием изменений в графе «тип метода».&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 1 - «современные» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|BLKLAN&lt;br /&gt;
|C/Matlab&lt;br /&gt;
|2003&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|BLZPACK&lt;br /&gt;
|F77&lt;br /&gt;
|2000, 04/00&lt;br /&gt;
|P  + S&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|IETL&lt;br /&gt;
|C++&lt;br /&gt;
|2006, 2.2&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SLEPc&lt;br /&gt;
|C/F77&lt;br /&gt;
|2009, 3.0.0&lt;br /&gt;
|All&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|TRLAN&lt;br /&gt;
|F90&lt;br /&gt;
|2006&lt;br /&gt;
|Dynamic thick-restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|PROPACK&lt;br /&gt;
|F77/Matlab&lt;br /&gt;
|2005, 2.1 / 1.1&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|O&lt;br /&gt;
|-&lt;br /&gt;
|IRBLEIGS&lt;br /&gt;
|Matlab&lt;br /&gt;
|2000, 1.0&lt;br /&gt;
|Indefinitie symmetric&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&amp;lt;b&amp;gt;Таблица 2 - «исторические» реализации.&amp;lt;/b&amp;gt;&lt;br /&gt;
!Название библиотеки&lt;br /&gt;
!Язык программирования&lt;br /&gt;
!Дата появления, версия библиотки&lt;br /&gt;
!Тип метода&lt;br /&gt;
!Параллелизация&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1995, 2.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|M&lt;br /&gt;
|-&lt;br /&gt;
|ARPACK++&lt;br /&gt;
|C++&lt;br /&gt;
|1998, 1.1&lt;br /&gt;
|Arnoldi iterations, impliicit restart&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANCZOS&lt;br /&gt;
|F77&lt;br /&gt;
|1992&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LANZ&lt;br /&gt;
|F77&lt;br /&gt;
|1991, 1.0&lt;br /&gt;
|P&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|LASO&lt;br /&gt;
|F77&lt;br /&gt;
|1983, 2&lt;br /&gt;
|S&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|NAPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1987&lt;br /&gt;
|N&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|QMRPACK&lt;br /&gt;
|F77&lt;br /&gt;
|1996&lt;br /&gt;
|Designed for nonsymmetrical matrices (lookahead)&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|SVDPACK&lt;br /&gt;
|C/F77&lt;br /&gt;
|1992&lt;br /&gt;
|P, finds SVD&lt;br /&gt;
|none&lt;br /&gt;
|-&lt;br /&gt;
|Underwood&lt;br /&gt;
|F77&lt;br /&gt;
|1975&lt;br /&gt;
|F, block version&lt;br /&gt;
|none&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:Bashleon&amp;diff=13379</id>
		<title>Участник:Bashleon</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:Bashleon&amp;diff=13379"/>
		<updated>2016-10-21T20:16:06Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: /* Макроструктура - пункт 1.4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вариант 4 &lt;br /&gt;
Башлыков Леонид Александрович&lt;br /&gt;
616&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;A * x&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = A * b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^2 * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^(n - 1) * b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A * K = [A * y_{1},...,A * y_{n - 1}, A * y_{n}] = [y_{2},...,y_{n},A^n * y_{1}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^-1 * A^n * y_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;A * K&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;A * K = K * [e_{2},e_{3},...,e_{n},-c] = K * C&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^-1 * A * K = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;A * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^(k - 1) * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;A * x = \lambda * x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = Q * Q&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^-1 * A * K = (R^-1 * Q^T) * A * (Q * R) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^T * A * Q = R * C * R^-1 = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^-1&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;A * Q_{j} = \beta_{j - 1} * q_{j - 1} + \alpha_{j} * q_{j} + \beta_{j} * q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;A * Q = Q * T&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^T * A * q_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^T&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;n * k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n * (n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^T * A * Q_{1}) / (Q_{1}^T * Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^T * A * Q&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k} * V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||A * P_{k} - P_{k} * D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;n * k &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k} * V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A * (Q_{k} * v_{i}) - (Q_{k} * v_{i}) * \theta_{i}||_{2} = ||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k} * |v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2} * \sin{2 * \theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Макроструктура - пункт 1.4====&lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша соединяет метод Ланцоша для построения крыловского подпространства в процедурой Рэлея-Ритца, подразумевающей вычисление собственных значений симметричной трёхдиагональной матрицы. Первая часть алгоритма представляет собой строго последовательные итерации, на каждой из которых вначале строится очередной столбец матрицы &amp;lt;math&amp;gt;Q_{j}&amp;lt;/math&amp;gt; из первых &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике используется QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = A * z&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^T * z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;A * x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;/div&gt;</summary>
		<author><name>Bashleon</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:Bashleon&amp;diff=13378</id>
		<title>Участник:Bashleon</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:Bashleon&amp;diff=13378"/>
		<updated>2016-10-21T20:15:33Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вариант 4 &lt;br /&gt;
Башлыков Леонид Александрович&lt;br /&gt;
616&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;A * x&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = A * b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^2 * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^(n - 1) * b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A * K = [A * y_{1},...,A * y_{n - 1}, A * y_{n}] = [y_{2},...,y_{n},A^n * y_{1}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^-1 * A^n * y_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;A * K&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;A * K = K * [e_{2},e_{3},...,e_{n},-c] = K * C&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^-1 * A * K = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;A * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^(k - 1) * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;A * x = \lambda * x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = Q * Q&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^-1 * A * K = (R^-1 * Q^T) * A * (Q * R) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^T * A * Q = R * C * R^-1 = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^-1&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;A * Q_{j} = \beta_{j - 1} * q_{j - 1} + \alpha_{j} * q_{j} + \beta_{j} * q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;A * Q = Q * T&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^T * A * q_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^T&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;n * k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n * (n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^T * A * Q_{1}) / (Q_{1}^T * Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^T * A * Q&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k} * V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||A * P_{k} - P_{k} * D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;n * k &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k} * V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A * (Q_{k} * v_{i}) - (Q_{k} * v_{i}) * \theta_{i}||_{2} = ||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k} * |v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2} * \sin{2 * \theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Макроструктура - пункт 1.4====&lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша соединяет метод Ланцоша для построения крыловского подпространства в процедурой Рэлея-Ритца, подразумевающей вычисление собственных значений симметричной трёхдиагональной матрицы. Первая часть алгоритма представляет собой строго последовательные итерации, на каждой из которых вначале строится очередной столбец матрицы &amp;lt;math&amp;gt;Q_{j}&amp;lt;/math&amp;gt; из первых &amp;lt;math&amp;gt;j&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&amp;lt;/math&amp;gt;. Итерационный процесс завершается, когда &amp;lt;math&amp;gt;j = k&amp;lt;/math&amp;gt;. Вторая часть алгоритма представляет собой поиск собственных значений и собственных векторов симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;, что реализуется отдельным алгоритмом, на практике это обычно бывает QR-алгоритм.&amp;lt;br/&amp;gt;&lt;br /&gt;
Особенность методов крыловского подпространства состоит в предположении, что матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; доступна в виде &amp;quot;черного ящика&amp;quot;, а именно подпрограммы, вычисляющей по заданному вектору &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; произведение &amp;lt;math&amp;gt;y = A * z&amp;lt;/math&amp;gt; (а также, возможно, произведение &amp;lt;math&amp;gt;y = A^T * z&amp;lt;/math&amp;gt;, если матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; несимметрична). Другими словами, прямой доступ к элементам матрицы и их изменение не используются, т.к. &lt;br /&gt;
*Умножение матрицы на вектор - наиболее дешевая нетривиальная операция, которую можно проделать с разреженной матрицей: в случае разреженной &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, содержащей &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; ненулевых элементов, для матрично-векторного умножения нужны &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; скалярных умножений и не более &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
*&amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть не представлена в виде матрицы явно, а доступна именно через подпрограмму для вычисления произведений &amp;lt;math&amp;gt;A * x&amp;lt;/math&amp;gt;.&lt;br /&gt;
Таким образом, как QR-алгоритм поиска собственных значений, собственных векторов матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; и оценки погрешности в них результирующей трехдиагональной матрицы, так и умножение матрицы на вектор внутри каждой итерации могут быть рассмотрены в качестве отдельных макроопераций. Проблемой является то, что именно эти манипуляции порождают основную вычислительную сложность алгоритма. Поскольку матрица, к которой применяется QR-алгоритм, имеет порядок &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; и на практике бывает мала, сделаем допущение о плотности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Тогда умножение этой матрицы на вектор внутри каждой итерации нужно будет реализовывать в рамках самого алгоритма. Еще одним важным замечанием является момент вычисления собственных значений матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt;. Её собственные значения, полученные на итерации &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;, никак не используются на итерации &amp;lt;math&amp;gt;p + 1&amp;lt;/math&amp;gt;, поэтому целесообразно вынести эту процедуру за основной цикл. Однако на практике в силу малых размеров матрицы &amp;lt;math&amp;gt;T_{j}&amp;lt;/math&amp;gt; вычисление соответствующих величин производится непосредственно в теле основного цикла, что позволяет сразу оценить достигнутую точность вычислений.&lt;/div&gt;</summary>
		<author><name>Bashleon</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:Bashleon&amp;diff=13364</id>
		<title>Участник:Bashleon</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:Bashleon&amp;diff=13364"/>
		<updated>2016-10-21T18:43:17Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вариант 4 &lt;br /&gt;
Башлыков Леонид Александрович&lt;br /&gt;
616&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;A * x&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = A * b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^2 * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^(n - 1) * b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A * K = [A * y_{1},...,A * y_{n - 1}, A * y_{n}] = [y_{2},...,y_{n},A^n * y_{1}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^-1 * A^n * y_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;A * K&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;A * K = K * [e_{2},e_{3},...,e_{n},-c] = K * C&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^-1 * A * K = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;A * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^(k - 1) * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;A * x = \lambda * x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = Q * Q&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^-1 * A * K = (R^-1 * Q^T) * A * (Q * R) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^T * A * Q = R * C * R^-1 = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^-1&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;A * Q_{j} = \beta_{j - 1} * q_{j - 1} + \alpha_{j} * q_{j} + \beta_{j} * q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;A * Q = Q * T&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^T * A * q_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^T&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;n * k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n * (n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^T * A * Q_{1}) / (Q_{1}^T * Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^T * A * Q&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k} * V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||A * P_{k} - P_{k} * D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;n * k &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k} * V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A * (Q_{k} * v_{i}) - (Q_{k} * v_{i}) * \theta_{i}||_{2} = ||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k} * |v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2} * \sin{2 * \theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В алгоритме Ланцоша из ортонормированных векторов строится матрица &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и в качестве приближенных собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; принимаются числа Ритца - собственные значения симметричной трёхдиагональной матрицы &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Bashleon</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:Bashleon&amp;diff=13363</id>
		<title>Участник:Bashleon</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:Bashleon&amp;diff=13363"/>
		<updated>2016-10-21T18:05:48Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вариант 4 &lt;br /&gt;
Башлыков Леонид Александрович&lt;br /&gt;
616&lt;br /&gt;
&lt;br /&gt;
Математическое описание алгоритма Ланцоща для вычисления собственных значений симметричной матрицы А&lt;br /&gt;
требует 1) математического описания метода Ланцоща для построения крыловского подпространства и 2)&lt;br /&gt;
математического описания т.н. процедуры Рэлея-Ритца.&lt;br /&gt;
&lt;br /&gt;
==== Метод Ланцоща для построения крыловского подпространства ====&lt;br /&gt;
&lt;br /&gt;
Пусть дано уравнение &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt;, причём вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; известен и имеется&lt;br /&gt;
способ вычисления &amp;lt;math&amp;gt;A * x&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вычислим &amp;lt;math&amp;gt;y_{1} = b&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;y_{2} = A * b&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;y_{3} = A^2 * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;y_{n} = A^(n - 1) * b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; - &lt;br /&gt;
порядок матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Определим матрицу &amp;lt;math&amp;gt;K = [y_{1},...,y_{n}]&amp;lt;/math&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;A * K = [A * y_{1},...,A * y_{n - 1}, A * y_{n}] = [y_{2},...,y_{n},A^n * y_{1}]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В предположении, что матрица &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - невырождена, можно вычислить вектор &amp;lt;math&amp;gt;c = -K^-1 * A^n * y_{1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Поскольку первые &amp;lt;math&amp;gt;n - 1&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;A * K&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;K&amp;lt;/math&amp;gt;, то справедливо: &amp;lt;math&amp;gt;A * K = K * [e_{2},e_{3},...,e_{n},-c] = K * C&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;K^-1 * A * K = C&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; - верхняя хессенбергова матрица.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заменим &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; ортогональной матрицей &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; так, что при любом &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
линейные оболочки первых &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; столбцов в &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - одно и то же&lt;br /&gt;
подпространство. Это подпространство называется крыловским и точно определяется как&lt;br /&gt;
&amp;lt;math&amp;gt;\kappa_{k}(A, b)&amp;lt;/math&amp;gt; - линейная оболочка векторов &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;A * b&amp;lt;/math&amp;gt;,...,&amp;lt;math&amp;gt;A^(k - 1) * b&amp;lt;/math&amp;gt;.&lt;br /&gt;
Суть алгоритма Ланцоша заключается в вычислении стольких первых столбцов в &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;,&lt;br /&gt;
сколько необходимо для получения требуемого приближения к решению &amp;lt;math&amp;gt;A * x = b&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;A * x = \lambda * x&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Используем QR-разложение матрицы &amp;lt;math&amp;gt;K = Q * Q&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Тогда &amp;lt;math&amp;gt;K^-1 * A * K = (R^-1 * Q^T) * A * (Q * R) = C&amp;lt;/math&amp;gt;, откуда &amp;lt;math&amp;gt;Q^T * A * Q = R * C * R^-1 = H&amp;lt;/math&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; является верхней хессенберговой в силу того, что верхней хессенберговой&lt;br /&gt;
является матрица &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;R^-1&amp;lt;/math&amp;gt; - верхние треугольные.&lt;br /&gt;
&lt;br /&gt;
Однако алгоритм Ланцоша подразумевает симметричность матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
Положим &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_{k} = [q_{1},...,q_{k}]&amp;lt;/math&amp;gt; и &lt;br /&gt;
&amp;lt;math&amp;gt;Q_{u} = [q_{k+1},...,q_{n}]&amp;lt;/math&amp;gt;. В итоге получается, что &amp;lt;math&amp;gt;H = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;&lt;br /&gt;
Из симметричности &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, таким образом, следует симметричность и трехдиагональность матрицы &amp;lt;math&amp;gt;H = T&amp;lt;/math&amp;gt;.&lt;br /&gt;
Теперь можно вывести две основные формулы, используемые в методе Ланцоша:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;A * Q_{j} = \beta_{j - 1} * q_{j - 1} + \alpha_{j} * q_{j} + \beta_{j} * q_{j + 1}&amp;lt;/math&amp;gt; - получается приравниванием столбцов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; в обеих частях равенства &amp;lt;math&amp;gt;A * Q = Q * T&amp;lt;/math&amp;gt;.&lt;br /&gt;
*&amp;lt;math&amp;gt;q_{j}^T * A * q_{j} = \alpha_{j}&amp;lt;/math&amp;gt; - получается домножением обеих частей предыдущего соотношения на &amp;lt;math&amp;gt;q_{j}^T&amp;lt;/math&amp;gt; и учетом ортогональности &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Процедура Рэлея-Ритца ====&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;Q = [Q_{k}, Q_{u}]&amp;lt;/math&amp;gt; - произвольная ортогональная матрица порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причём&lt;br /&gt;
&amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Q_{u}&amp;lt;/math&amp;gt; имеют размеры &amp;lt;math&amp;gt;n * k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n * (n - k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T = Q^T * A * Q = [Q_{k},Q_{u}]^T * A * [Q_{k},Q_{u}]&amp;lt;/math&amp;gt;. Обратим внимание, что в случае &amp;lt;math&amp;gt;k = 1&amp;lt;/math&amp;gt; выражение &amp;lt;math&amp;gt;T_{k} = Q_{k}^T * A * Q_{k}&amp;lt;/math&amp;gt; -&lt;br /&gt;
отношение Рэлея &amp;lt;math&amp;gt;\rho(Q_{1},A)&amp;lt;/math&amp;gt;, то есть число &amp;lt;math&amp;gt;(Q_{1}^T * A * Q_{1}) / (Q_{1}^T * Q_{1})&amp;lt;/math&amp;gt;. Определим теперь суть&lt;br /&gt;
процедуры Рэлея-Ритца:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Процедура Рэлея-Ритца - интерпретация собственных значений матрицы &amp;lt;math&amp;gt;T = Q^T * A * Q&amp;lt;/math&amp;gt; как приближений к собственным значениям матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Эти приближения называются числами Ритца. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - спектральное  разложение матрицы &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;. Столбцы матрицы &amp;lt;math&amp;gt;Q_{k} * V&amp;lt;/math&amp;gt; рассматриваются как приближения к соответствующим собственным векторам и называются векторами Ритца.&lt;br /&gt;
&lt;br /&gt;
Существует несколько важных фактов о процедуре Рэлея-Ритца, характеризующих получаемые приближения собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Минимум величины &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2}&amp;lt;/math&amp;gt; по всем симметричным &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матрицам &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достигается при &amp;lt;math&amp;gt;R = T_{k}&amp;lt;/math&amp;gt;. При этом &amp;lt;math&amp;gt;||A * Q_{k} - Q_{k} * R||_{2} = ||T_{ku}||_{2}&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;T_{k}&amp;lt;/math&amp;gt;. Минимум величины &amp;lt;math&amp;gt;||A * P_{k} - P_{k} * D||_{2}&amp;lt;/math&amp;gt;, когда &amp;lt;math&amp;gt;P_{k}&amp;lt;/math&amp;gt; пробегает множество &amp;lt;math&amp;gt;n * k &amp;lt;/math&amp;gt; матрицы с ортонормированными столбцами, таких, что &amp;lt;math&amp;gt;span(P_{k}) = span(Q_{k})&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; пробегает множество диагональных &amp;lt;math&amp;gt;k * k&amp;lt;/math&amp;gt; матриц также равен &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt; и достигается для &amp;lt;math&amp;gt;P_{k} = Q_{k} * V&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;D = \lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; - те же самые матрицы. Пусть &amp;lt;math&amp;gt;T_{k} = V * \lambda * V^T&amp;lt;/math&amp;gt; - всё то же спектральное разложение,&lt;br /&gt;
причём &amp;lt;math&amp;gt;V = [v_{1},...,v_{k}]&amp;lt;/math&amp;gt; - ортогональная матрица, а &amp;lt;math&amp;gt;\lambda = diag(\theta_{1},...,\theta_{k})&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;\alpha_{1},...,\alpha_{k}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, такие, что &amp;lt;math&amp;gt;|\theta_{i} - \alpha_{i}| &amp;lt;= ||T_{ku}||_{2}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i = 1,...,k&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена методом Ланцоша,то правая часть этого выражения равняется &amp;lt;math&amp;gt;\beta_{k}&amp;lt;/math&amp;gt;, то есть единственному элементу блока &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt;, который может быть отличен от нуля. Указанный эдемент находится в правом верхнем углу блока.&lt;br /&gt;
* &amp;lt;math&amp;gt;||A * (Q_{k} * v_{i}) - (Q_{k} * v_{i}) * \theta_{i}||_{2} = ||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;. Таким образом, разность между числом Ритца &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; и некоторым собственным значением &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не превышает величины &amp;lt;math&amp;gt;||T_{ku} * v_{i}||_{2}&amp;lt;/math&amp;gt;, которая может быть много меньше, чем &amp;lt;math&amp;gt;||T_{ku}||_{2}&amp;lt;/math&amp;gt;. Если матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то эта величина равна &amp;lt;math&amp;gt;\beta_{k} * |v_{i}(k)|&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{i}(k)&amp;lt;/math&amp;gt; - k-ая компонента вектора &amp;lt;math&amp;gt;v_{i}&amp;lt;/math&amp;gt;. Таким образом, можно дещево вычислить норму невязки - левой части выражения, не выполняя ни одного умножения вектора на матрицы &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Не имея информации о спектре матрицы &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt;, нельзя дать какую-либо содержательную оценку для погрешности в векторе Ритца &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt;. Если известно, что &amp;lt;math&amp;gt;\theta_{j}&amp;lt;/math&amp;gt; отделено расстоянием, не меньшим &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt;, от прочих собственных значений матриц &amp;lt;math&amp;gt;T_{k}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;T_{u}&amp;lt;/math&amp;gt; и матрица &amp;lt;math&amp;gt;Q_{k}&amp;lt;/math&amp;gt; вычислена алгоритмом Ланцоша, то угол &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; между &amp;lt;math&amp;gt;Q_{k} * v_{i}&amp;lt;/math&amp;gt; и точным собственным вектором &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; можно оценить формулой &amp;lt;math&amp;gt;\frac{1}{2} * \sin{2 * \theta} &amp;lt;= \frac{b_{k}}{g}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bashleon</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:Bashleon&amp;diff=13327</id>
		<title>Участник:Bashleon</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:Bashleon&amp;diff=13327"/>
		<updated>2016-10-21T14:43:01Z</updated>

		<summary type="html">&lt;p&gt;Bashleon: Новая страница: «Вариант 4  Башлыков Леонид Александрович 616»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Вариант 4 &lt;br /&gt;
Башлыков Леонид Александрович&lt;br /&gt;
616&lt;/div&gt;</summary>
		<author><name>Bashleon</name></author>
	</entry>
</feed>