<?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=Malikovmt</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=Malikovmt"/>
	<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/Malikovmt"/>
	<updated>2026-10-22T17:08:00Z</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:Malikovmt&amp;diff=22348</id>
		<title>Обсуждение участника:Malikovmt</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:Malikovmt&amp;diff=22348"/>
		<updated>2017-02-06T21:16:36Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:41, 3 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
Сделано&lt;br /&gt;
&lt;br /&gt;
* Граф, приведённый в разделе 1.7, непонятен без пояснений, например, что означают разные типы стрелочек. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:41, 3 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
Сделано&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - например, с какими опциями проводилась компиляция. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:41, 3 февраля 2017 (MSK)&lt;br /&gt;
&lt;br /&gt;
Сделано&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22347</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22347"/>
		<updated>2017-02-06T21:16:02Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основные операции алгоритма: &lt;br /&gt;
&lt;br /&gt;
1. Перемножение матрицы на вектор.&lt;br /&gt;
&amp;lt;math&amp;gt;b=Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Двойная ортогонализация методом Грмма-Шмидта.&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i,&amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j}q_{j-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Вычисление обновленного базисного вектора.&lt;br /&gt;
&amp;lt;math&amp;gt;q_{i+1} = z/ \beta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
Черные маленькие стрелочки - куда идут данные.&lt;br /&gt;
&lt;br /&gt;
Большие стрелочки - обозначение прохода по массиву (изменение индекса)&lt;br /&gt;
&lt;br /&gt;
В больших кружках преобразования (операции над данными или вычисления)&lt;br /&gt;
&lt;br /&gt;
В маленьких кружках запись в переменную.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась с параметрами: &lt;br /&gt;
*openmpi/1.5.5-icc&lt;br /&gt;
*intel/13.1.0&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22346</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22346"/>
		<updated>2017-02-06T21:14:13Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основные операции алгоритма: &lt;br /&gt;
&lt;br /&gt;
1. Перемножение матрицы на вектор.&lt;br /&gt;
&amp;lt;math&amp;gt;b=Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Двойная ортогонализация методом Грмма-Шмидта.&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i,&amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j}q_{j-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Вычисление обновленного базисного вектора.&lt;br /&gt;
&amp;lt;math&amp;gt;q_{i+1} = z/ \beta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
Черные маленькие стрелочки - куда идут данные.&lt;br /&gt;
&lt;br /&gt;
Большие стрелочки - обозначение прохода по массиву (изменение индекса)&lt;br /&gt;
&lt;br /&gt;
В больших кружках преобразования (операции над данными или вычисления)&lt;br /&gt;
&lt;br /&gt;
В маленьких кружках запись в переменную.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
Сборка осуществлялась с параметрами: &lt;br /&gt;
*openmpi/1.5.5-icc&lt;br /&gt;
*intel/13.1.0&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22345</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22345"/>
		<updated>2017-02-06T21:11:41Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основные операции алгоритма: &lt;br /&gt;
&lt;br /&gt;
1. Перемножение матрицы на вектор.&lt;br /&gt;
&amp;lt;math&amp;gt;b=Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Двойная ортогонализация методом Грмма-Шмидта.&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i,&amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j}q_{j-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Вычисление обновленного базисного вектора.&lt;br /&gt;
&amp;lt;math&amp;gt;q_{i+1} = z/ \beta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
Черные маленькие стрелочки - куда идут данные.&lt;br /&gt;
&lt;br /&gt;
Большие стрелочки - обозначение прохода по массиву (изменение индекса)&lt;br /&gt;
&lt;br /&gt;
В больших кружках преобразования (операции над данными или вычисления)&lt;br /&gt;
&lt;br /&gt;
В маленьких кружках запись в переменную.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22344</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22344"/>
		<updated>2017-02-06T21:03:57Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основные операции алгоритма: &lt;br /&gt;
&lt;br /&gt;
1. Перемножение матрицы на вектор.&lt;br /&gt;
&amp;lt;math&amp;gt;b=Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Двойная ортогонализация методом Грмма-Шмидта.&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i,&amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j}q_{j-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Вычисление обновленного базисного вектора.&lt;br /&gt;
&amp;lt;math&amp;gt;q_{i+1} = z/ \beta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22343</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22343"/>
		<updated>2017-02-06T21:02:27Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основные операции алгоритма: &lt;br /&gt;
1. Перемножение матрицы на вектор.&lt;br /&gt;
&amp;lt;math&amp;gt;b=Ax&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Двойная ортогонализация методом Грмма-Шмидта.&lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i,&amp;lt;/math&amp;gt; &lt;br /&gt;
&amp;lt;math&amp;gt;z=z-\alpha_jq_j-\beta_{j}q_{j-1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Вычисление обновленного базисного вектора.&lt;br /&gt;
&amp;lt;math&amp;gt;q_{i+1} = z/ \beta&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22034</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22034"/>
		<updated>2017-02-01T22:08:31Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22033</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22033"/>
		<updated>2017-02-01T22:02:20Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/sWQ9ihcW код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22032</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22032"/>
		<updated>2017-02-01T21:52:46Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр|мини|800x800пкс|Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22031</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22031"/>
		<updated>2017-02-01T21:52:06Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos prof.jpg|центр||Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22030</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22030"/>
		<updated>2017-02-01T21:49:00Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Проверка масштабируемости алгоритма проходила на [//hpc.cmc.msu.ru/ IBM Blue Gene/P ВМК МГУ.]&lt;br /&gt;
&lt;br /&gt;
Используемые компиляторы: intel/15.0.090 и  OpenMPI/1.8.4-icc.&lt;br /&gt;
&lt;br /&gt;
Для проведения расчетов и получения полноценной картины поведения алгоритма в зависимости от входных данных и числа процессоров, программа была запущена на следующих параметрах:&lt;br /&gt;
* размеры входной матрицы: [5000:30000] c шагом 5000;&lt;br /&gt;
* число процессоров: от 1, 2, 4 .. 64.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lancos_prof.png|центр||Рис. 2. Зависимость времени выполнения программы от входных данных]]&lt;br /&gt;
&lt;br /&gt;
По графику видно, что время выполнения уменьшается с увеличением количества процессоров примерно до 16, дальше начинает медленно увеличиваться вплоть до 64 и далее. Это можно объяснить тем, что с увеличением количества вычислительных ядер растет количество передаваемых данных, и дальнейшее увеличение их числа только ухудшает положение.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22025</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22025"/>
		<updated>2017-02-01T20:50:38Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
 Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22024</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22024"/>
		<updated>2017-02-01T20:48:33Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Литература */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
The IETL Project http://www.comp-phys.org/software/ietl/ C++&lt;br /&gt;
&lt;br /&gt;
NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R&lt;br /&gt;
&lt;br /&gt;
ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB&lt;br /&gt;
&lt;br /&gt;
GrapLab https://turi.com/products/create/open_source.html C++&lt;br /&gt;
&lt;br /&gt;
LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran (уже распараллелена)&lt;br /&gt;
&lt;br /&gt;
Julia Math  https://github.com/JuliaMath/IterativeSolvers.jl Julia&lt;br /&gt;
&lt;br /&gt;
SciPy https://scipy.org/ Python&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22023</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22023"/>
		<updated>2017-02-01T20:44:56Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* В классическом алгоритме Ланцоша возникает большая погрешность при округлении чисел с плавающей точкой. Выбранный вариант с полной переортогонализацией устраняет этот недостаток, однако является более ресурсоемким. На практике наиболее популярен вариант с частичной переортогонализацией.&lt;br /&gt;
* Вычислительная мощность алгоритма (отношение числа операций к суммарному объему данных) оценивается как &amp;lt;math&amp;gt;\approx 2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Преимуществом алгоритма является то, что он начинает поиск собственных значений матрицы начиная с максимального в абсолютном смысле значения.&lt;br /&gt;
* Нет необходимости хранения исходной матрицы на каждом вычислительном ядре, так как метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать регулярность структуры матрицы. &lt;br /&gt;
* Существует модифицированный блочный вариант алгоритма, применяемый в случае кратных собственных значений.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22022</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22022"/>
		<updated>2017-02-01T20:25:01Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt; - симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; - вектор собственных значений матрицы и соответствующие им собственные вектора &amp;lt;math&amp;gt;v_i,i=1,\ldots, k &amp;lt;/math&amp;gt;. Объем данных: &amp;lt;math&amp;gt; k(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22021</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22021"/>
		<updated>2017-02-01T20:19:50Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
*вектор приближенных собственных значений матрицы &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt;).&lt;br /&gt;
*приближения к собственным векторам &#039;&#039;&amp;lt;math&amp;gt;v_i,i=1,\ldots, m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; m(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22020</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22020"/>
		<updated>2017-02-01T20:17:23Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений;&lt;br /&gt;
*2. вычисление &amp;lt;math&amp;gt;\alpha_j&amp;lt;/math&amp;gt; требует &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с 1 операцией умножения в каждом;&lt;br /&gt;
*3. переортагонализация требует вычисления &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; операциями умножения в каждом;&lt;br /&gt;
*4. вычисление нормы вектора длины &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;1&amp;lt;/math&amp;gt; операцией умножения в каждом.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22019</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22019"/>
		<updated>2017-02-01T20:11:20Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. процесс ортогонализации &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-го вектора Ритца;&lt;br /&gt;
*2. умножение исходной матрицы на вектор;&lt;br /&gt;
*3. вычисление нормы вектора, их скалярного произведения и другие векторные операции.&lt;br /&gt;
&lt;br /&gt;
Умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22012</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22012"/>
		<updated>2017-02-01T19:32:57Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Ланцоша - итерационный, итерации должны выполняться в строгой последовательности, и нет возможности их параллелизовать. Внутри одной итерации алгоритма ресурсами параллелизма могут быть: &lt;br /&gt;
*1. процесс ортогонализации &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-го вектора Ритца;&lt;br /&gt;
*2. умножение исходной матрицы на вектор;&lt;br /&gt;
*3. вычисление нормы вектора, их скалярного произведения и другие векторные операции.&lt;br /&gt;
&lt;br /&gt;
Умножение матрицы размерности &amp;lt;math&amp;gt;n * n&amp;lt;/math&amp;gt; на вектор длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует последовательного выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22005</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22005"/>
		<updated>2017-02-01T19:18:19Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|center|300px|&#039;&#039;&#039;Рис. 1.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22003</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22003"/>
		<updated>2017-02-01T19:12:54Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczos.png|thumb|center|300px|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Граф &#039;&#039;j&#039;&#039;-й итерации.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22001</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=22001"/>
		<updated>2017-02-01T18:42:01Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21992</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21992"/>
		<updated>2017-02-01T17:56:24Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21990</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21990"/>
		<updated>2017-02-01T17:52:24Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21988</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21988"/>
		<updated>2017-02-01T17:44:32Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
*1. Основная часть операций в алгоритме Ланцоша производится во время умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q&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; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений. Остальные операции основного цикла производят меньше &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; операций сложения или умножения. Так как умножение матрицы на вектор производится &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз, то сложность этой части алгоритма - &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*2. Процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений. Производится в цикле &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; раз. Сложность - &amp;lt;math&amp;gt;O(nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
*3. Процесс разложения матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k*k&amp;lt;/math&amp;gt;. Сложность - &amp;lt;math&amp;gt;O(k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как число итераций много меньше размерности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, то общая сложность алгоритма сокращается до &amp;lt;math&amp;gt;O(kn^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21986</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21986"/>
		<updated>2017-02-01T17:31:10Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*1. умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
*2. процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21984</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21984"/>
		<updated>2017-02-01T17:06:10Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параграфе 1.2 приводится полная схема последовательного алгоритма. &lt;br /&gt;
&lt;br /&gt;
Заполняем начальные значения алгоритма (&#039;&#039;b&#039;&#039; - начальное преближение).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
&amp;amp; \beta_1=0,\\&lt;br /&gt;
&amp;amp;q_0=0, \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;math&amp;gt;j=1..k&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*1. Вычисляется &#039;&#039;j&#039;&#039;-й диагональный элемент матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z=Aq_j; \alpha_j=q_j^Tz;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*2. Проводится полная переортогонализация Грамма-Шмидта: &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*3. Вычисляются значения &amp;lt;math&amp;gt;\beta_{j+1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\beta_{j+1}=||z||;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4. Если &amp;lt;math&amp;gt;\beta_{j+1}=0&amp;lt;/math&amp;gt;, то алгоритм завершается;&lt;br /&gt;
&lt;br /&gt;
*5. Сохраняем значения для следующей итерации &amp;lt;math&amp;gt;q_{j+1}=z/\beta_{j+1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*1. умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
*2. процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21983</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21983"/>
		<updated>2017-02-01T16:42:37Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*1. умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
*2. процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21982</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21982"/>
		<updated>2017-02-01T16:42:03Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
* &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*1. умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
*2. процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21981</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21981"/>
		<updated>2017-02-01T16:41:33Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
*1. &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*2. &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
*1. умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
*2. процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21980</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21980"/>
		<updated>2017-02-01T16:32:08Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
*1. &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
&lt;br /&gt;
*2. &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В указанном алгоритме можно выделить следующие основные операции:&lt;br /&gt;
* умножение матрицы на вектор;&lt;br /&gt;
* вычисление нормы вектора;&lt;br /&gt;
* скалярное произведение векторов;&lt;br /&gt;
* вычисление собственных значений и соответствующих им векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21978</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21978"/>
		<updated>2017-02-01T16:23:25Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительным ядро алгоритма состоит ииз двух основных частей:&lt;br /&gt;
*1. &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt; - умножение симметричной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt; на вектор &#039;&#039;q&#039;&#039; размерности &#039;&#039;n&#039;&#039; - вычислительная сложность: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n^2-n&amp;lt;/math&amp;gt; сложений&lt;br /&gt;
&lt;br /&gt;
*2. &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; - процесс ортогонализации Грама-Шмидта - вычислительная сложность: &amp;lt;math&amp;gt;k^2n+k(n+2)&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k^2n + k(n + 1) + 2&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21977</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21977"/>
		<updated>2017-02-01T16:13:18Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21976</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21976"/>
		<updated>2017-02-01T16:02:04Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\;\beta_0=0,\;q_0=0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q^T_j z\\&lt;br /&gt;
&amp;amp; z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i,\;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i \\&lt;br /&gt;
&amp;amp; \beta_j = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j =0\; break\\&lt;br /&gt;
&amp;amp; q_{j+1} = \frac{z}{\beta_j}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21975</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21975"/>
		<updated>2017-02-01T16:01:46Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Описание метода: &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j = z_j - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j / \Vert z_j&#039;&#039; \Vert_2 = z_j/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\;\beta_0=0,\;q_0=0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q^T_j z\\&lt;br /&gt;
&amp;amp; z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i,\;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i \\&lt;br /&gt;
&amp;amp; \beta_j = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j =0\; break\\&lt;br /&gt;
&amp;amp; q_{j+1} = \frac{z}{\beta_j}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21974</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21974"/>
		<updated>2017-02-01T15:57:17Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. Числа и векторы Ритца являются оптимальными приближениями к собственным значениям и собственным векторам матрицы &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\;\beta_0=0,\;q_0=0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q^T_j z\\&lt;br /&gt;
&amp;amp; z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i,\;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i \\&lt;br /&gt;
&amp;amp; \beta_j = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j =0\; break\\&lt;br /&gt;
&amp;amp; q_{j+1} = \frac{z}{\beta_j}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21973</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21973"/>
		<updated>2017-02-01T15:55:28Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Первый этап алгоритма - использование метода Ланцоша для построения крыловского подпространства: &amp;lt;math&amp;gt; K_k(A,x) = span[x_1, Ax_1, A^2x_1, ..., A^{k-1}x_1] &amp;lt;/math&amp;gt;. Входные данные алгоритма: квадратная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;n*n&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;math&amp;gt;T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_2 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующий шаг алгоритма - процедура Рэлея-Ритца. Она зкалючается в интерпретации собственных значений матрицы &amp;lt;math&amp;gt; T_k=Q_k^TAQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
Ее собственные значения приближают собственные значения исходной матрицы. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; - спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, тогда столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответствующим собственным векторам матрицы &#039;&#039;A&#039;&#039; и называются векторами Ритца. &lt;br /&gt;
&lt;br /&gt;
Поиск собственных значений матрицы &#039;&#039;T&#039;&#039; намного легче, чем для исходной матрицы, так как предполагается, что &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, и матрица &#039;&#039;T&#039;&#039; - трехдиагональная.&lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация необходима для того, чтобы гарантировать, что каждый полученный вектор &#039;&#039;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&#039;&#039; ортогонален уже имеющимся векторам &#039;&#039;q&amp;lt;sub&amp;gt;1..j&amp;lt;/sub&amp;gt;&#039;&#039;. Без этого процесса будут накапливаться существенные вычислительный ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\;\beta_0=0,\;q_0=0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q^T_j z\\&lt;br /&gt;
&amp;amp; z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i,\;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i \\&lt;br /&gt;
&amp;amp; \beta_j = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j =0\; break\\&lt;br /&gt;
&amp;amp; q_{j+1} = \frac{z}{\beta_j}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21947</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21947"/>
		<updated>2017-02-01T14:00:23Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;k(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;k &amp;lt;&amp;lt; n&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях. Алгоритм используется для больших &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21946</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21946"/>
		<updated>2017-02-01T13:54:09Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21944</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21944"/>
		<updated>2017-02-01T13:32:13Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для выбора числа &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21943</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21943"/>
		<updated>2017-02-01T13:30:08Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, используемый для вычисления части собственных значений и соответствующих им собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n*n&amp;lt;/math&amp;gt;, изначально разработанный Корнелием Ланцошем. Преимуществами использования метода является относительно небольшое потребление памяти и вычислительных ресурсов, а также наличие параметра &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, контролирующего количество итераций. Несмотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод был плохо применим из-за численной неустойчивости - метод хорошо работал на целочисленных значениях, однако в арифметике с плавающей точкой ошибки округления давали большую погрешность. В 1970 году Ojalvo и Newman показали, как сделать метод численно стабильным и применили его для расчета крупных инженерных сооружений, подверженных динамическим нагрузкам. Кроме того, они показали способ выбора начального приближения (с использованием ГПСЧ), а также эмпирический способ для нахождения числа &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; (примерно в полтора раза больше искомого числа собственных векторов). В данный момент существует две основных модификации метода (с полной и выборочной переортогонализацией), а также большое количество модификаций, использующихся в различных технических областях.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21797</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21797"/>
		<updated>2017-01-30T00:00:18Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод, разработанный Корнелиусом Ланцошем, является адаптацией &#039;&#039;&#039;power methods&#039;&#039;&#039; для вычисления наиболее полезных собственных значений и собственных векторов n^{{th}} &#039;&#039;&#039;order linear system&#039;&#039;&#039; за ограниченное количество операций &#039;&#039;&#039;m&#039;&#039;&#039;, где &#039;&#039;&#039;m&#039;&#039;&#039; много меньше &#039;&#039;&#039;n&#039;&#039;&#039;. Не смотря на то, что алгоритм является вычислительно эффективным, первоначально сформулированный метод не был полезным из-за его численной неустойчивости. В 1970 году &#039;&#039;&#039;Ojalvo&#039;&#039;&#039; и Ньюман показали как сделать метод численно стабильным и применили его для решения задачи очень крупных инженерных сооружений   &lt;br /&gt;
&lt;br /&gt;
==== Симметричность и положительная определённость матрицы ====&lt;br /&gt;
&lt;br /&gt;
==== Режим накопления ====&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21796</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21796"/>
		<updated>2017-01-29T20:23:53Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]]), [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
==== Симметричность и положительная определённость матрицы ====&lt;br /&gt;
&lt;br /&gt;
==== Режим накопления ====&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21795</id>
		<title>Учacтник:Malikovmt/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87ac%D1%82%D0%BD%D0%B8%D0%BA:Malikovmt/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=21795"/>
		<updated>2017-01-29T20:23:22Z</updated>

		<summary type="html">&lt;p&gt;Malikovmt: Новая страница: «{{algorithm | name              = Алгоритм Ланцоша с полной переортогонализацией | serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2k + nk^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(nk + k^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2 + n&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы: [[Участник:Eroshkin|А.В.Ерошкин]] ([[#Масштабируемость алгоритма и его реализации|ссылкаКод]], [[Участник:Malikovmt|М.М.Маликов]] ([[#Описание алгоритма|ссылка]])&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
==== Симметричность и положительная определённость матрицы ====&lt;br /&gt;
&lt;br /&gt;
==== Режим накопления ====&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
===== Структура обращений в память и качественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
===== Количественная оценка локальности =====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&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;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#[[en:Cholesky decomposition]]&lt;br /&gt;
&lt;br /&gt;
#[[Категория:Законченные статьи]]&lt;br /&gt;
#[[Категория:Разложения матриц]]&lt;/div&gt;</summary>
		<author><name>Malikovmt</name></author>
	</entry>
</feed>