<?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=Sfedotov</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=Sfedotov"/>
	<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/Sfedotov"/>
	<updated>2026-10-22T23:56:40Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=19074</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=19074"/>
		<updated>2016-11-24T09:56:03Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)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;
Пусть задана некая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 1: Вычислить &amp;lt;math&amp;gt;q_1, \beta_0, q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 2:В цикле последовательно вычислять матрицу &amp;lt;math&amp;gt;T_j,\alpha_j, \beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Найти собственные значения матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;&lt;br /&gt;
*Если &amp;lt;math&amp;gt;\beta_j=0&amp;lt;/math&amp;gt; Выход&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|&#039;&#039;&#039;Рисунок 1.&#039;&#039;&#039; Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|&#039;&#039;&#039;Рисунок 2.&#039;&#039;&#039; Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией является итерационным. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Внутри одной итерации ресурсами параллелизма могут быть процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца, умножение исходной матрицы на вектор, вычисление нормы вектора и другие векторные операции.&lt;br /&gt;
Умножение вещественной симметричной матрицы &#039;&#039;A&#039;&#039; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор &#039;&#039;b&#039;&#039; длины &#039;&#039;n&#039;&#039; требует последовательного выполнения &#039;&#039;n&#039;&#039; ярусов умножений и сложений. &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;
*Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов с учётом &#039;&#039;k&#039;&#039; итераций оценивается в &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}=\frac{n^2}{\log{n}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, оценивается в &amp;lt;math&amp;gt;\frac{k\,n^2}{0.5\,n^2+1.5\,n+k\,n+k+1}\approx 2\,k&amp;lt;/math&amp;gt; так как в прикладных задачах часто требуется небольшое число собственных значений и справедливо &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования алгоритма была протестирована параллельная MPI-реализация библиотеки [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan] на языке Fortran90. Исследование проводилось на суперкомпьютере Ломоносов[http://parallel.ru/cluster/]&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
* размер матрицы от 5000 до 25000 с шагом 500.&lt;br /&gt;
* число процессоров 1, 2, 4, [8:144] с шагом 8.&lt;br /&gt;
Для всех запусков требовалось найти 10 минимальных собственных значений диагональной матрицы. Величины производительности и времени выполнения брались из вывода встроенной функции состояния trl_print_info. На следующих рисунках приведены графики производительности и времени выполнения данной реализации в зависимости от изменяемых параметров запуска:&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Trlanlib_mpi1.png|thumb|center|700px|&#039;&#039;&#039;Рисунок 3.&#039;&#039;&#039; Производительность в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Trlanlib_mpi2.png|thumb|center|700px|&#039;&#039;&#039;Рисунок 4.&#039;&#039;&#039; Время выполнения в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
Можно заметить, что данная реализация немасштабируема и не дает ускорения при увеличении числа процессов. Из рисунков 3, 4 хорошо видно, что наилучшая производительность достигается с использованием только одного-двух процессов. Дальнейшее увеличение числа процессов лишь приводит к снижению эффективности. После 8-ми процессов ситуация стабилизируется и дальнейшее распараллеливание мало сказывается на результат&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Использованные модули и компиляторы&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Модули:&lt;br /&gt;
 mkl/4.0.2.146 &lt;br /&gt;
 impi/5.0.1-ofa &lt;br /&gt;
компилятор mpif90, параметры компиляции:&lt;br /&gt;
 mpif90 -I/opt/intel/composer_xe_2013.2.146/mkl/include/ia32  -I/opt/intel/composer_xe_2013.2.146/mkl/include -O0 /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_blas95_lp64.a /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_lapack95_lp64.a -L/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl simple.f90 -o simple lapack_aux.o ../../libtrlan_mpi.a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*библиотека [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=19025</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=19025"/>
		<updated>2016-11-23T12:30:04Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)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;
Пусть задана некая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 1: Вычислить &amp;lt;math&amp;gt;q_1, \beta_0, q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 2:В цикле последовательно вычислять матрицу &amp;lt;math&amp;gt;T_j,\alpha_j, \beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Найти собственные значения матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;&lt;br /&gt;
*Если &amp;lt;math&amp;gt;\beta_j=0&amp;lt;/math&amp;gt; Выход&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией является итерационным. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Внутри одной итерации ресурсами параллелизма могут быть процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца, умножение исходной матрицы на вектор, вычисление нормы вектора и другие векторные операции.&lt;br /&gt;
Умножение вещественной симметричной матрицы &#039;&#039;A&#039;&#039; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор &#039;&#039;b&#039;&#039; длины &#039;&#039;n&#039;&#039; требует последовательного выполнения &#039;&#039;n&#039;&#039; ярусов умножений и сложений. &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;
*Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов с учётом &#039;&#039;k&#039;&#039; итераций оценивается в &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}=\frac{n^2}{\log{n}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, оценивается в &amp;lt;math&amp;gt;\frac{k\,n^2}{0.5\,n^2+1.5\,n+k\,n+k+1}\approx 2\,k&amp;lt;/math&amp;gt; так как в прикладных задачах часто требуется небольшое число собственных значений и справедливо &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования алгоритма была протестирована параллельная MPI-реализация библиотеки [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan] на языке Fortran90. Исследование проводилось на суперкомпьютере Ломоносов[http://parallel.ru/cluster/]&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
* размер матрицы от 5000 до 25000 с шагом 500.&lt;br /&gt;
* число процессоров 1, 2, 4, [8:144] с шагом 8.&lt;br /&gt;
Для всех запусков требовалось найти 10 минимальных собственных значений диагональной матрицы. Величины производительности и времени выполнения брались из вывода встроенной функции состояния trl_print_info. На следующих рисунках приведены графики производительности и времени выполнения данной реализации в зависимости от изменяемых параметров запуска:&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Trlanlib_mpi1.png|thumb|center|700px|Рисунок 3: Производительность в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Trlanlib_mpi2.png|thumb|center|700px|Рисунок 4: Время выполнения в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
Можно заметить, что данная реализация немасштабируема и не дает ускорения при увеличении числа процессов. Из рисунков 3, 4 хорошо видно, что наилучшая производительность достигается с использованием только одного-двух процессов. Дальнейшее увеличение числа процессов лишь приводит к снижению эффективности. После 8-ми процессов ситуация стабилизируется и дальнейшее распараллеливание мало сказывается на результат&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Использованные модули и компиляторы&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Модули:&lt;br /&gt;
 mkl/4.0.2.146 &lt;br /&gt;
 impi/5.0.1-ofa &lt;br /&gt;
компилятор mpif90, параметры компиляции:&lt;br /&gt;
 mpif90 -I/opt/intel/composer_xe_2013.2.146/mkl/include/ia32  -I/opt/intel/composer_xe_2013.2.146/mkl/include -O0 /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_blas95_lp64.a /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_lapack95_lp64.a -L/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl simple.f90 -o simple lapack_aux.o ../../libtrlan_mpi.a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*библиотека [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18902</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18902"/>
		<updated>2016-11-21T22:47:21Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)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;
Пусть задана некая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 1: Вычислить &amp;lt;math&amp;gt;q_1, \beta_0, q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 2:В цикле последовательно вычислять матрицу &amp;lt;math&amp;gt;T_j,\alpha_j, \beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Найти собственные значения матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;&lt;br /&gt;
*Если &amp;lt;math&amp;gt;\beta_j=0&amp;lt;/math&amp;gt; Выход&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией является итерационным. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Внутри одной итерации ресурсами параллелизма могут быть процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца, умножение исходной матрицы на вектор, вычисление нормы вектора и другие векторные операции.&lt;br /&gt;
Умножение вещественной симметричной матрицы &#039;&#039;A&#039;&#039; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор &#039;&#039;b&#039;&#039; длины &#039;&#039;n&#039;&#039; требует последовательного выполнения &#039;&#039;n&#039;&#039; ярусов умножений и сложений. &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;
*Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов с учётом &#039;&#039;k&#039;&#039; итераций оценивается в &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}=\frac{n^2}{\log{n}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, оценивается в &amp;lt;math&amp;gt;\frac{k\,n^2}{0.5\,n^2+1.5\,n+k\,n+k+1}\approx 2\,k&amp;lt;/math&amp;gt; так как в прикладных задачах часто требуется небольшое число собственных значений и справедливо &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования алгоритма была протестирована параллельная MPI-реализация библиотеки [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan] на языке Fortran90. Исследование проводилось на суперкомпьютере Ломоносов[http://parallel.ru/cluster/]&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
* размер матрицы от 5000 до 25000 с шагом 500.&lt;br /&gt;
* число процессоров 1, 2, 4, [8:144] с шагом 8.&lt;br /&gt;
Для всех запусков требовалось найти 10 минимальных собственных значений диагональной матрицы. Величины производительности и времени выполнения брались из вывода встроенной функции состояния trl_print_info. На следующих рисунках приведены графики производительности и времени выполнения данной реализации в зависимости от изменяемых параметров запуска:&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Trlanlib_mpi1.png|thumb|center|700px|Рисунок 3: Производительность в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Trlanlib_mpi2.png|thumb|center|700px|Рисунок 4: Время выполнения в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
Можно заметить, что данная реализация немасштабируема и не дает ускорения при увеличении числа процессов. Из рисунков 3, 4 хорошо видно, что наилучшая производительность достигается с использованием только одного-двух процессов. Дальнейшее увеличение числа процессов лишь приводит к снижению эффективности. После 8-ми процессов ситуация стабилизируется и дальнейшее распараллеливание мало сказывается на результат&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Использованные модули и компиляторы&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Модули:&lt;br /&gt;
 mkl/11.2.0 &lt;br /&gt;
 impi/4.1.0 &lt;br /&gt;
компилятор mpif90, параметры компиляции:&lt;br /&gt;
 mpif90 -I/opt/intel/composer_xe_2013.2.146/mkl/include/ia32  -I/opt/intel/composer_xe_2013.2.146/mkl/include -O0 /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_blas95_lp64.a /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_lapack95_lp64.a -L/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl simple.f90 -o simple lapack_aux.o ../../libtrlan_mpi.a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*библиотека [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sfedotov&amp;diff=18901</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=18901"/>
		<updated>2016-11-21T22:46:43Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.5 кроме блок-схемы нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.8 должна быть оценка параллельной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:43, 16 ноября 2016 (MSK)&lt;br /&gt;
 Добавил&lt;br /&gt;
&lt;br /&gt;
* Рисунки в статье не пронумерованы. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:17, 21 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:17, 21 ноября 2016 (MSK) &lt;br /&gt;
* В разделе 2.4 не объяснены множественные особенности графиков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:17, 21 ноября 2016 (MSK) &lt;br /&gt;
* Из графиков в разделе 2.4 следует сделать выводы о масштабируемости реализации. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:17, 21 ноября 2016 (MSK)&lt;br /&gt;
 Исправлено&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi1.png&amp;diff=18900</id>
		<title>Файл:Trlanlib mpi1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi1.png&amp;diff=18900"/>
		<updated>2016-11-21T22:43:27Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: Sfedotov загрузил новую версию Файл:Trlanlib mpi1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18899</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18899"/>
		<updated>2016-11-21T22:41:37Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)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;
Пусть задана некая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 1: Вычислить &amp;lt;math&amp;gt;q_1, \beta_0, q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 2:В цикле последовательно вычислять матрицу &amp;lt;math&amp;gt;T_j,\alpha_j, \beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Найти собственные значения матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;&lt;br /&gt;
*Если &amp;lt;math&amp;gt;\beta_j=0&amp;lt;/math&amp;gt; Выход&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией является итерационным. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Внутри одной итерации ресурсами параллелизма могут быть процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца, умножение исходной матрицы на вектор, вычисление нормы вектора и другие векторные операции.&lt;br /&gt;
Умножение вещественной симметричной матрицы &#039;&#039;A&#039;&#039; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор &#039;&#039;b&#039;&#039; длины &#039;&#039;n&#039;&#039; требует последовательного выполнения &#039;&#039;n&#039;&#039; ярусов умножений и сложений. &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;
*Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов с учётом &#039;&#039;k&#039;&#039; итераций оценивается в &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}=\frac{n^2}{\log{n}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, оценивается в &amp;lt;math&amp;gt;\frac{k\,n^2}{0.5\,n^2+1.5\,n+k\,n+k+1}\approx 2\,k&amp;lt;/math&amp;gt; так как в прикладных задачах часто требуется небольшое число собственных значений и справедливо &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования алгоритма была протестирована параллельная MPI-реализация библиотеки [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan] на языке Fortran90. Исследование проводилось на суперкомпьютере Ломоносов[http://parallel.ru/cluster/]&lt;br /&gt;
Набор и границы значений изменяемых параметров реализации алгоритма: &lt;br /&gt;
* размер матрицы от 5000 до 25000 с шагом 500.&lt;br /&gt;
* число процессоров 1, 2, 4, [8:144] с шагом 8.&lt;br /&gt;
Для всех запусков требовалось найти 10 минимальных собственных значений диагональной матрицы. Величины производительности и времени выполнения брались из вывода встроенной функции состояния trl_print_info. На следующих рисунках приведены графики производительности и времени выполнения данной реализации в зависимости от изменяемых параметров запуска:&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Trlanlib_mpi1.png|thumb|center|700px|Рисунок 3: Производительность в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Trlanlib_mpi2.png|thumb|center|700px|Рисунок 4: Время выполнения в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
Можно заметить, что данная реализация немасштабируема и не дает ускорения при увеличении числа процессов. Из рисунков 3, 4 хорошо видно, что наилучшая производительность достигается с использованием только одного-двух процессов. Дальнейшее увеличение числа процессов лишь приводит к снижению эффективности. После 8-ми процессов ситуация стабилизируется и дальнейшее распараллеливание мало сказывается на результат&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Использованные модули и компиляторы&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Модули:&lt;br /&gt;
 mkl/11.2.0 &lt;br /&gt;
 impi/4.1.0 &lt;br /&gt;
компилятор mpif90, параметры компиляции:&lt;br /&gt;
 mpif90 -I/opt/intel/composer_xe_2013.2.146/mkl/include/ia32  -I/opt/intel/composer_xe_2013.2.146/mkl/include -O0 /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_blas95_lp64.a /opt/intel/composer_xe_2013.2.146/mkl/lib/intel64/libmkl_lapack95_lp64.a -L/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl simple.f90 -o simple lapack_aux.o ../../libtrlan_mpi.a&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*библиотека [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi2.png&amp;diff=18898</id>
		<title>Файл:Trlanlib mpi2.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi2.png&amp;diff=18898"/>
		<updated>2016-11-21T22:15:30Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi1.png&amp;diff=18897</id>
		<title>Файл:Trlanlib mpi1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi1.png&amp;diff=18897"/>
		<updated>2016-11-21T22:15:13Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: Sfedotov загрузил новую версию Файл:Trlanlib mpi1.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18597</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18597"/>
		<updated>2016-11-20T15:38:43Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)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;
Пусть задана некая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 1: Вычислить &amp;lt;math&amp;gt;q_1, \beta_0, q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 2:В цикле последовательно вычислять матрицу &amp;lt;math&amp;gt;T_j,\alpha_j, \beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Найти собственные значения матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;&lt;br /&gt;
*Если &amp;lt;math&amp;gt;\beta_j=0&amp;lt;/math&amp;gt; Выход&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией является итерационным. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Внутри одной итерации ресурсами параллелизма могут быть процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца, умножение исходной матрицы на вектор, вычисление нормы вектора и другие векторные операции.&lt;br /&gt;
Умножение вещественной симметричной матрицы &#039;&#039;A&#039;&#039; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор &#039;&#039;b&#039;&#039; длины &#039;&#039;n&#039;&#039; требует последовательного выполнения &#039;&#039;n&#039;&#039; ярусов умножений и сложений. &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;
*Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов с учётом &#039;&#039;k&#039;&#039; итераций оценивается в &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}=\frac{n^2}{\log{n}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, оценивается в &amp;lt;math&amp;gt;\frac{k\,n^2}{0.5\,n^2+1.5\,n+k\,n+k+1}\approx 2\,k&amp;lt;/math&amp;gt; так как в прикладных задачах часто требуется небольшое число собственных значений и справедливо &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования алгоритма была протестирована параллельная MPI-реализация библиотеки [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan] на языке Fortran90. Исследование проводилось на суперкомпьютере Ломоносов[http://parallel.ru/cluster/]&lt;br /&gt;
Параметры запуска алгоритма:&lt;br /&gt;
* размер матрицы от 5000 до 25000 с шагом 500.&lt;br /&gt;
* число процессоров от 8 до 128 с шагом 8.&lt;br /&gt;
В результате проведённых экспериментов максимальная эффективность реализации составила 9.03%, а минимальная - 0.31%.&lt;br /&gt;
На следующих рисунках приведены графики производительности и эффективности данной реализации в зависимости от изменяемых параметров запуска.&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[file:Trlanlib_mpi1.png|thumb|center|700px|График производительности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
 |[[file:Trlanlib_mpi2.png|thumb|center|700px|График эффективности в зависимости от числа процессоров и размера матрицы.]]&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Использованные модули и компиляторы&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
module add slurm&lt;br /&gt;
&lt;br /&gt;
module add impi&lt;br /&gt;
&lt;br /&gt;
module add mkl&lt;br /&gt;
&lt;br /&gt;
Для тестовой программы был использован компилятор mpif90, флаги компиляции:&lt;br /&gt;
 -I${MKLROOT}/include/intel64/lp64 -I${MKLROOT}/include -O0&lt;br /&gt;
линковки:&lt;br /&gt;
 ${MKLROOT}/lib/intel64/libmkl_blas95_lp64.a ${MKLROOT}/lib/intel64/libmkl_lapack95_lp64.a -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*библиотека [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sfedotov&amp;diff=18596</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=18596"/>
		<updated>2016-11-20T15:38:31Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.5 кроме блок-схемы нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.8 должна быть оценка параллельной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:43, 16 ноября 2016 (MSK)&lt;br /&gt;
 Добавил&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi1.png&amp;diff=18593</id>
		<title>Файл:Trlanlib mpi1.png</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Trlanlib_mpi1.png&amp;diff=18593"/>
		<updated>2016-11-20T15:25:34Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sfedotov&amp;diff=18195</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=18195"/>
		<updated>2016-11-18T16:02:24Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: /* Статья Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.5 кроме блок-схемы нужны также текстовые пояснения. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.8 должна быть оценка параллельной сложности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
* В разделе 1.10 должна быть оценка вычислительной мощности алгоритма. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:31, 1 ноября 2016 (MSK)&lt;br /&gt;
 Исправил &lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:43, 16 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18194</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=18194"/>
		<updated>2016-11-18T16:02:12Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)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;
Пусть задана некая симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 1: Вычислить &amp;lt;math&amp;gt;q_1, \beta_0, q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаг 2:В цикле последовательно вычислять матрицу &amp;lt;math&amp;gt;T_j,\alpha_j, \beta_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Найти собственные значения матрицы &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt;&lt;br /&gt;
*Если &amp;lt;math&amp;gt;\beta_j=0&amp;lt;/math&amp;gt; Выход&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией является итерационным. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Внутри одной итерации ресурсами параллелизма могут быть процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца, умножение исходной матрицы на вектор, вычисление нормы вектора и другие векторные операции.&lt;br /&gt;
Умножение вещественной симметричной матрицы &#039;&#039;A&#039;&#039; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; на вектор &#039;&#039;b&#039;&#039; длины &#039;&#039;n&#039;&#039; требует последовательного выполнения &#039;&#039;n&#039;&#039; ярусов умножений и сложений. &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;
*Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов с учётом &#039;&#039;k&#039;&#039; итераций оценивается в &lt;br /&gt;
&amp;lt;math&amp;gt;\frac{kn^2}{k \log{n}}=\frac{n^2}{\log{n}}&amp;lt;/math&amp;gt;&lt;br /&gt;
*Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, оценивается в &amp;lt;math&amp;gt;\frac{k\,n^2}{0.5\,n^2+1.5\,n+k\,n+k+1}\approx 2\,k&amp;lt;/math&amp;gt; так как в прикладных задачах часто требуется небольшое число собственных значений и справедливо &amp;lt;math&amp;gt;k&amp;lt;&amp;lt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*программный пакет [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Sfedotov&amp;diff=14416</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=14416"/>
		<updated>2016-10-28T12:54:54Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=14376</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=14376"/>
		<updated>2016-10-28T12:31:37Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца может быть вычислен параллельно, как и умножение исходной матрицы на вектор.&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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*программный пакет [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=13117</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=13117"/>
		<updated>2016-10-18T17:18:22Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца может быть вычислен параллельно, как и умножение исходной матрицы на вектор.&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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*программный пакет [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=13116</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=13116"/>
		<updated>2016-10-18T16:51:10Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного метода все копии кратного собственного значения будут найдены на одном шаге, в простом же методе Ланцоша они определяются последовательно. Блочный метод, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*программный пакет [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GrapLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=13108</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=13108"/>
		<updated>2016-10-18T12:26:06Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного метода все копии кратного собственного значения будут найдены на одном шаге, в простом же методе Ланцоша они определяются последовательно. Блочный метод, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*программный пакет [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GrapLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=12814</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=12814"/>
		<updated>2016-10-16T20:16:18Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11266</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11266"/>
		<updated>2016-10-15T19:03:17Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11258</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11258"/>
		<updated>2016-10-15T19:00:48Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_{jj} = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11171</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11171"/>
		<updated>2016-10-15T18:44:03Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_{jj} = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;k+1&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11163</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11163"/>
		<updated>2016-10-15T18:42:19Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов веществнной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_{jj} = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;k+1&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11061</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=11061"/>
		<updated>2016-10-15T18:16:08Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов веществнной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_{jj} = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;k+1&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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, 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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=10994</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=10994"/>
		<updated>2016-10-15T18:01:51Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов веществнной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали - &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_{jj} = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;k+1&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;q_i,i=1, 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;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i\|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого метода Ланцоша имеет смысл использовать блочный (ленточный) метод Ланцоша. В блочном методе Ланцоша в отличие от простого метода вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого метода в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до  &#039;&#039;l&#039;&#039;. Поэтому блочный метод с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#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;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=10731</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=10731"/>
		<updated>2016-10-15T17:11:20Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: &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^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&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;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; --- итерационный метод вычисления собственных значений и собственных векторов веществнной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности -[[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#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;&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;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}\\&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 - \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; 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;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали - &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_{jj} = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов такой матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализации требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;k+1&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс переортогонализации &#039;&#039;j&#039;&#039;-го приближения может быть вычислен параллельно &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;q_i,i=1, 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;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Lineprinter&amp;diff=5593</id>
		<title>Обсуждение участника:Lineprinter</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:Lineprinter&amp;diff=5593"/>
		<updated>2016-10-12T07:49:20Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: /* Перенос */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Перенос ==&lt;br /&gt;
&lt;br /&gt;
Статья:[[Алгоритм_Ланцоша_с_полной_переортогонализацией]];&lt;br /&gt;
Выполняет:[[Участник:Sfedotov| Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: algowiki-project.org/ru/Решение_задачи_Коши_для_системы_ОДУ_методом_Рунге-Кутты_4_порядка;&lt;br /&gt;
Выполняют: Алимов Дамир и Антон Лесничий&lt;br /&gt;
&lt;br /&gt;
Статья: Алгоритм кластеризации, основанный на минимальном остовном дереве;&lt;br /&gt;
Выполняет: Стандрик Антон Сергеевич (Astandrik)&lt;br /&gt;
&lt;br /&gt;
Статья: [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)|Нахождение собственных чисел квадратной матрицы методом QR разложения (3)]];&lt;br /&gt;
Выполняют: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]];&lt;br /&gt;
Выполняют: [[Участница:Почернина_Елена| Почернина Елена]] и [[Участница:Светлана|Костюкова Светлана]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Метод_Ньютона_для_решения_систем_нелинейных_уравнений(2)]];&lt;br /&gt;
Выполняют: [[Участник:Oleggium|Гирняк О.Р.]], [[Участник:Dimx19|Васильков Д.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Алгоритм_кластеризации_с_использованием_представлений]];&lt;br /&gt;
Выполняют: [[Участник:Cookie|Шатков С.А.]], [[Антохина Ю.А.]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_преобразование_Фурье_(FFT)|Быстрое преобразование Фурье (FFT)]];&lt;br /&gt;
Выполняют: [[Участник:Victoria_Stepanischeva|Степанищева Виктория]] и [[Участник:Igor_Munkin|Мунькин Игорь]]&lt;br /&gt;
&lt;br /&gt;
Статья: [[Быстрое_дискретное_преобразование_Фурье|Быстрое_дискретное_преобразование_Фурье]];&lt;br /&gt;
Выполняют: [[Участник:ivanov.kir.m | К.М.Иванов]], [[Участник:Pumpkin | А.C.Сапин]]&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=4543</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%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=4543"/>
		<updated>2016-10-05T17:50:58Z</updated>

		<summary type="html">&lt;p&gt;Sfedotov: Новая страница: «=  Свойства и структура алгоритмов =  == Общее описание алгоритма == &amp;#039;&amp;#039;&amp;#039;Алгоритм Ланцоша с по…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша с полной переортогонализацией&#039;&#039;&#039; является инструментом поиска собственных значений и собственных векторов симметричной матрицы A. Это итерационный многошаговый метод для сильно больших матриц, преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Алгоритм Ланцоша соединяет метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. На &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;]&#039;&#039;, и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца, т. е. собственные значения симметричной трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;. Пусть &#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;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Sfedotov</name></author>
	</entry>
</feed>