<?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=%D0%98%D0%B3%D0%BE%D1%80%D1%8C</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=%D0%98%D0%B3%D0%BE%D1%80%D1%8C"/>
	<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/%D0%98%D0%B3%D0%BE%D1%80%D1%8C"/>
	<updated>2026-10-22T19:00:12Z</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=20260</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=20260"/>
		<updated>2016-12-07T16:31:50Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 1. Выбрать пару индексов j,k&lt;br /&gt;
 2. Обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 Если &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице, перейти к шагу 1.&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 Если &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; достаточно мал, вычисление заканчивается. В противном случае выполняются следующие действия:&lt;br /&gt;
      1. Если  &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;, то угол &amp;lt;math&amp;gt;\theta=\frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
         В остальных случаях находим параметры &amp;lt;math&amp;gt;\tau,\ t,\ c,\ s&amp;lt;/math&amp;gt;:&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      2. Выполняется поворот матрицы (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;):&lt;br /&gt;
           &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI. Компиляция производилась с помощью команды mpicxx с использованием компилятора Intel с OpenMPI и библиотеки MKL. Были подключены следующие модули: openmpi/1.5.5-icc, intel/13.1.0, mkl/4.0.2.146. Программа была запущена в очередях test и regular4.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|1500px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|1500px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
На Рис.4 видно, что при увеличении количества процессов производительность сначала увеличивается, а затем уменьшается. Время работы алгоритма резко увеличивается при увеличении размеров матрицы, что обусловлено большим количеством сообщений, обрабатываемых корневым процессом. Полученные результаты говорят о плохой масштабируемости алгоритма.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по [http://pastebin.com/juwPJRhH ссылке].&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18885</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18885"/>
		<updated>2016-11-21T20:14:37Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI. Компиляция производилась с помощью команды mpicxx с использованием компилятора Intel с OpenMPI и библиотеки MKL. Были подключены следующие модули: openmpi/1.5.5-icc, intel/13.1.0, mkl/4.0.2.146. Программа была запущена в очередях test и regular4.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|1500px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|1500px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
На Рис.4 видно, что при увеличении количества процессов производительность сначала увеличивается, а затем уменьшается. Время работы алгоритма резко увеличивается при увеличении размеров матрицы, что обусловлено большим количеством сообщений, обрабатываемых корневым процессом. Полученные результаты говорят о плохой масштабируемости алгоритма.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по [http://pastebin.com/juwPJRhH ссылке].&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18873</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18873"/>
		<updated>2016-11-21T19:53:37Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Масштабируемость алгоритма и его реализации */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI. Компиляция производилась с помощью команды mpicxx с использованием компилятора Intel с OpenMPI и библиотеки MKL. Были подключены следующие модули: openmpi/1.5.5-icc, intel/13.1.0, mkl/4.0.2.146. Программа была запущена в очередях test и regular4.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|1500px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|1500px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
На Рис.4 видно, что при увеличении количества процессов производительность сначала увеличивается, а затем уменьшается. Время работы алгоритма резко увеличивается при увеличении размеров матрицы, что обусловлено большим количеством сообщений, обрабатываемых корневым процессом. Полученные результаты говорят о плохой масштабируемости алгоритма.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по [http://pastebin.com/juwPJRhH ссылке].&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18872</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18872"/>
		<updated>2016-11-21T19:50:47Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Масштабируемость алгоритма и его реализации */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI. Компиляция производилась с помощью команды mpicxx с использованием компилятора Intel с OpenMPI и библиотеки MKL. Были подключены следующие модули: openmpi/1.5.5-icc, intel/13.1.0, mkl/4.0.2.146. Программа была запущена в очередях test и regular4.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|1500px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|1500px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
На Рис.4 видно, что при увеличении количества процессов производительность сначала увеличивается, а затем уменьшается. Время работы алгоритма резко увеличивается при увеличении размеров матрицы. Полученные результаты говорят о плохой масштабируемости алгоритма.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по [http://pastebin.com/juwPJRhH ссылке].&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18871</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18871"/>
		<updated>2016-11-21T19:47:31Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Масштабируемость алгоритма и его реализации */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI. Компиляция производилась с помощью команды mpicxx с использованием компилятора Intel с OpenMPI и библиотеки MKL. Были подключены следующие модули: openmpi/1.5.5-icc, intel/13.1.0, mkl/4.0.2.146.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|1500px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|1500px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
На Рис.4 видно, что при увеличении количества процессов производительность сначала увеличивается, а затем уменьшается. Время работы алгоритма резко увеличивается при увеличении размеров матрицы. Полученные результаты говорят о плохой масштабируемости алгоритма.&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по [http://pastebin.com/juwPJRhH ссылке].&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18859</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18859"/>
		<updated>2016-11-21T18:40:01Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Масштабируемость алгоритма и его реализации */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI. Компиляция производилась с помощью команды mpicxx с использованием компилятора Intel с OpenMPI и библиотеки MKL. Были подключены следующие модули: openmpi/1.5.5-icc, intel/13.1.0, mkl/4.0.2.146.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|1500px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|1500px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
На Рис.4 видно, что при увеличении количества процессов производительность сначала увеличивается, а затем уменьшается. Время работы алгоритма резко увеличивается при увеличении размеров матрицы. Полученные результаты говорят о плохой масштабируемости алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18234</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18234"/>
		<updated>2016-11-18T18:44:43Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|720px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|720px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18205</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=18205"/>
		<updated>2016-11-18T16:22:57Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Масштабируемость алгоритма и его реализации */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
Исследование масштабируемости проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского Государственного Университета имени М.В. Ломоносова]. Алгоритм реализован на языке C++ с использованием средств MPI.&lt;br /&gt;
&lt;br /&gt;
Значения изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*	число процессов: 2, 4, 8, 16, 32, 64;&lt;br /&gt;
*	число элементов в матрице: 900, 3600, 8100, 14400, 22500, 32400, 44100, 57600, 72900, 90000.&lt;br /&gt;
&lt;br /&gt;
На следующих рисунках приведены графики времени выполнения и производительности выбранной реализации алгоритма в зависимости от изменяемых параметров запуска&lt;br /&gt;
&lt;br /&gt;
[[File:jacobi_time.jpg|thumb|center|720px|Рисунок 3. Изменение времени выполнения в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
[[File:jacobi_perform.jpg|thumb|center|720px|Рисунок 4. Изменение производительности в зависимости от числа процессов и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=16454</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=16454"/>
		<updated>2016-11-11T18:26:34Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos (2\theta)}{\sin (2\theta)} = \operatorname{ctg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt; a_{jj}^{(i)} = a_{kk}^{(i)}&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\theta = \frac{\pi}{4}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{tg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично &amp;lt;ref&amp;gt;Wilkinson J. H. The Algebraic Eigenvalue Problem // Oxford University Press, UK, 1965, P. 270&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=16446</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=16446"/>
		<updated>2016-11-11T17:05:04Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot;&amp;gt;Деммель Дж. Вычислительная линейная алгебра. - М.: МИР, 2001 -  С. 244-248&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
      if &amp;lt;math&amp;gt;a_{jj}==a_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
           &amp;lt;math&amp;gt;\theta=\frac{\Pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
      else&lt;br /&gt;
           &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
           \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
           t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
           c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
           s &amp;amp;= c\,t&lt;br /&gt;
           \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
      end if&lt;br /&gt;
      &amp;lt;math&amp;gt;A = R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &amp;lt;/math&amp;gt;    &lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы &amp;lt;ref name=&amp;quot;VVVVVV&amp;quot; /&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;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=13805</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=13805"/>
		<updated>2016-10-25T20:06:17Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Свойства алгоритма */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным.&lt;br /&gt;
&lt;br /&gt;
Вычислительная мощность алгоритма линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=13795</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=13795"/>
		<updated>2016-10-25T17:10:46Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма и др.), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма и др.) Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=13794</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=13794"/>
		<updated>2016-10-25T17:03:42Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]] (входные и выходные данные, математическое описание алгоритма), [[Участник: Игорь|И.А.Плахов]] (ресурс параллелизма алгоритма,последовательная сложность алгоритма). Вклад авторов считать равноценным.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11210</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11210"/>
		<updated>2016-10-15T18:54:12Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Математическое описание алгоритма */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10344</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10344"/>
		<updated>2016-10-15T15:52:11Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|none|thumb|2000px|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|none|thumb|2000px|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10255</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10255"/>
		<updated>2016-10-15T15:34:59Z</updated>

		<summary type="html">&lt;p&gt;Игорь: Отмена правки 10251, сделанной участником Игорь (обс.)&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10251</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10251"/>
		<updated>2016-10-15T15:34:00Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Информационный граф */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Информационный_граф_метода_якоби.png|left|frame|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
[[File:ГрафJ.png|left|frame|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=9517</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=9517"/>
		<updated>2016-10-15T12:41:19Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Ресурс параллелизма алгоритма */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Как правило, для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=9000</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=9000"/>
		<updated>2016-10-15T10:21:02Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Существующие реализации алгоритма */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализующая последовательный вариант метода Якоби на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python].&lt;br /&gt;
Данная библиотека распространяется по лицензии [http://people.sc.fsu.edu/~jburkardt/txt/gnu_lgpl.txt GNU LESSER GENERAL PUBLIC LICENSE].&lt;br /&gt;
&lt;br /&gt;
Существует также параллельная [http://ieeexplore.ieee.org/document/6310877/ реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8894</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8894"/>
		<updated>2016-10-15T09:53:48Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Вычислительное ядро алгоритма */&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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Рассматривая отдельную итерацию, можно считать, что вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализованная на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python],&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8193</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8193"/>
		<updated>2016-10-14T21:08:37Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &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^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализованная на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python],&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7666</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7666"/>
		<updated>2016-10-14T15:27:46Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализованная на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python],&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7652</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7652"/>
		<updated>2016-10-14T15:18:00Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализованная на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python],&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7650</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7650"/>
		<updated>2016-10-14T15:17:12Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Применение вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализованная на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python],&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7649</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7649"/>
		<updated>2016-10-14T15:16:49Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Эту процедуру, в свою очередь, можно разделить на две логические части:&lt;br /&gt;
# Определение угла поворота &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; по элементам матрицы &amp;lt;math&amp;gt;a_{jj}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;a_{kk}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
# Применение вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (изменяются лишь строки и столбцы, соответствующие индексам &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;amp;nbsp;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует библиотека JACOBI_EIGENVALUE, реализованная на языках программирования [http://people.sc.fsu.edu/~jburkardt/c_src/jacobi_eigenvalue/jacobi_eigenvalue.html С], [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html С++], [http://people.sc.fsu.edu/~jburkardt/f77_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN77], [http://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html FORTRAN90], [http://people.sc.fsu.edu/~jburkardt/m_src/jacobi_eigenvalue/jacobi_eigenvalue.html MATLAB], [http://people.sc.fsu.edu/~jburkardt/py_src/jacobi_eigenvalue/jacobi_eigenvalue.html Python],&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7532</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7532"/>
		<updated>2016-10-14T13:38:51Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби является самым медленным из имеющихся алгоритмов вычисления собственных значений симметричной матрицы. Тем не менее, он способен вычислять малые собственные числа и отвечающие им собственные векторы с гораздо большей точностью, чем другие методы&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244)&amp;lt;/ref&amp;gt;. Кроме того, он не предполагает первоначального приведения матрицы к трехдиагональной форме.&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В [http://people.sc.fsu.edu/~jburkardt/cpp_src/cpp_src.html C++ Source Codes] имеется библиотека [http://people.sc.fsu.edu/~jburkardt/cpp_src/jacobi_eigenvalue/jacobi_eigenvalue.html JACOBI_EIGENVALUE].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7329</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7329"/>
		<updated>2016-10-14T10:56:45Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности. Один &amp;quot;цикл&amp;quot; (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций. Асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7286</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7286"/>
		<updated>2016-10-14T10:26:43Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7278</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7278"/>
		<updated>2016-10-14T10:19:50Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\times n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7270</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7270"/>
		<updated>2016-10-14T10:15:16Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для осуществления одной итерации метода Якоби для матрицы размера &amp;lt;math&amp;gt;(n\,x\,n)&amp;lt;/math&amp;gt; требуется выполнить:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 4n+4 &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; 2n+2 &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; умножения,&lt;br /&gt;
* &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; деления,&lt;br /&gt;
* &amp;lt;math&amp;gt; 5 &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; 2 &amp;lt;/math&amp;gt; извлечения квадратного корня.&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
Так как выбор индексов &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; осуществляется путем перебора внедиагональных элементов матрицы, для полного прохода потребуется &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из трёх групп вершин.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7252</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7252"/>
		<updated>2016-10-14T09:55:08Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = R(j,k,\theta) = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     выбрать пару индексов j,k&lt;br /&gt;
     обратиться к процедуре &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Существует несколько способов выбора пары &amp;lt;math&amp;gt;j,k&amp;lt;/math&amp;gt;. Наиболее простой и быстрый способ — построчный циклический обход внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n^2\,(n-1) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{n(n-1)(2n+1)}{2} &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Первой&#039;&#039;&#039; группе вершин (J) соответствует вычисление значений c и s.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Второй&#039;&#039;&#039; группе вершин (А) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третьей&#039;&#039;&#039; группе вершин (B) соответствует вычисление значений элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:{{#expr: 3 * (400 + 35) + 4 * (3 - 1) + 8}}px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=400px heights=400px&amp;gt;&lt;br /&gt;
File:Информационный_граф_метода_якоби.png|Рисунок 1. Граф одной итерации алгоритма без отображения входных и выходных данных.&lt;br /&gt;
File:ГрафJ.png|Рисунок 2. Внутренний граф вершин J с входными параметрами &amp;lt;math&amp;gt;x = a_{jj}^{(i)}, y = a_{kk}^{(i)}, z = a_{jk}^{(i)}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для выполнения одной итерации требуется последовательно выполнить следующие действия:&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения).&lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотически метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, образуют пучки рассылок линейной мощности.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6527</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6527"/>
		<updated>2016-10-13T14:59:24Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n^2\,(n-1) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{n(n-1)(2n+1)}{2} &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения). &#039;&#039;Либо можно считать эти элементы совместно, тогда получится в сумме 8 умножений и 5 сложений, но не знаю, стоит ли этим заморачиваться&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотиески метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов для метода Якоби является линейным, вычислительная мощность алгоритма также линейна.&lt;br /&gt;
&lt;br /&gt;
Метод Якоби не детерминирован, так как является итерационным алгоритмом с выходом по точности: число итераций зависит от входных данных и порогового значения.&lt;br /&gt;
&lt;br /&gt;
Дуги информационного графа, исходящие из вершин, соответствующих вычислениям значений &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&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;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6489</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6489"/>
		<updated>2016-10-13T14:17:58Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n^2\,(n-1) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{n(n-1)(2n+1)}{2} &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения). &#039;&#039;Либо можно считать эти элементы совместно, тогда получится в сумме 8 умножений и 5 сложений, но не знаю, стоит ли этим заморачиваться&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотиески метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6480</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6480"/>
		<updated>2016-10-13T13:54:00Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,\dotsc,A_m&amp;lt;/math&amp;gt;, сходящуюся к диагональной матрице, на диагонали которой стоят собственные значения. Для построения этой последовательности применяется специально подобранная матрица поворота &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt;, такая что норма наддиагональной части &amp;lt;math&amp;gt;of\!f(A)=\sqrt{\sum\limits_{1 \le j &amp;lt; k \le n} a_{jk}^2}&amp;lt;/math&amp;gt; уменьшается при каждом повороте матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Вычисление останавливается, когда угол поворота становится близок к нулю, либо когда максимальный внедиагональный элемент становится меньше заранее выбранного порогового значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n^2\,(n-1) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{n(n-1)(2n+1)}{2} &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения). &#039;&#039;Либо можно считать эти элементы совместно, тогда получится в сумме 8 умножений и 5 сложений, но не знаю, стоит ли этим заморачиваться&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотиески метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6427</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6427"/>
		<updated>2016-10-13T12:28:12Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n^2\,(n-1) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{n(n-1)(2n+1)}{2} &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
# вычислить &amp;lt;math&amp;gt;\tau&amp;lt;/math&amp;gt; (2 операции сложения, 1 операция деления)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; (1 операция сравнения, 1 операция взятия модуля, 2 операции сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня)&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (1 операция сложения, 1 операция умножения, 1 операция деления, 1 операция извлечения квадратного корня) и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; (1 операция умножения)&lt;br /&gt;
&lt;br /&gt;
После этого выполняется ярус, отвечающий за применение поворота к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным выполнением &amp;lt;math&amp;gt;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; , а также 2 операций вычисления элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;. Наибольшее количество операций содержится в вычислении последних двух элементов (по 6 умножений и 3 сложения). &#039;&#039;Либо можно считать эти элементы совместно, тогда получится в сумме 8 умножений и 5 сложений, но не знаю, стоит ли этим заморачиваться&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Количество итераций зависит от входных данных, однако асимптотиески метод сходится квадратично&amp;lt;ref&amp;gt;J. H. Wilkinson. The Algebraic Eigenvalue Problem. Oxford University Press, UK, 1965. (стр 270)&amp;lt;/ref&amp;gt;. Нередко для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, при классификации по высоте ЯПФ метод Якоби относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;amp;nbsp;, а при классификации по ширине ЯПФ — к алгоритмам со сложностью &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: вектор собственных значений &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5897</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5897"/>
		<updated>2016-10-12T17:29:20Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Отсюда получим равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n^2\,(n-1) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{n(n-1)(2n+1)}{2} &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5888</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5888"/>
		<updated>2016-10-12T17:14:31Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k,&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза, а также вычисление элементов &amp;lt;math&amp;gt;a_{jj}^{(i+1)} &amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kk}^{(i+1)} &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5886</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5886"/>
		<updated>2016-10-12T16:55:25Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt;, &amp;amp;nbsp; &amp;lt;math&amp;gt;m \ne j,k&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5885</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5885"/>
		<updated>2016-10-12T16:46:05Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Игорь|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:%D0%98%D0%B3%D0%BE%D1%80%D1%8C&amp;diff=5884</id>
		<title>Участник:Игорь</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:%D0%98%D0%B3%D0%BE%D1%80%D1%8C&amp;diff=5884"/>
		<updated>2016-10-12T16:45:04Z</updated>

		<summary type="html">&lt;p&gt;Игорь: Новая страница: «Плахов Игорь Александрович, группа 614»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Плахов Игорь Александрович, группа 614&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5254</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5254"/>
		<updated>2016-10-10T20:42:41Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5246</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5246"/>
		<updated>2016-10-10T20:15:58Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году&amp;lt;ref&amp;gt;Jacobi, C.G.J. (1846). «[http://resolver.sub.uni-goettingen.de/purl/?GDZPPN002144522 Über ein leichtes Verfahren, die in der Theorie der Säkularstörungen vorkommenden Gleichungen numerisch aufzulösen]» (German). Crelle&#039;s Journal 30: 51–94.&amp;lt;/ref&amp;gt;, хотя использоваться он начал только в 1950-х годах с появлением компьютеров&amp;lt;ref&amp;gt;Golub, G.H. (2000). «Eigenvalue computation in the 20th century». Journal of Computational and Applied Mathematics 123 (1-2): 35–65. DOI:[https://dx.doi.org/10.1016%2FS0377-0427%2800%2900413-1 10.1016/S0377-0427(00)00413-1].&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246-248)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5224</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5224"/>
		<updated>2016-10-10T19:13:08Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5223</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5223"/>
		<updated>2016-10-10T19:12:31Z</updated>

		<summary type="html">&lt;p&gt;Игорь: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
      t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\cdot A\cdot R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка n методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра —&lt;br /&gt;
* &amp;lt;math&amp;gt; 2\,n(n-1)(n-2) &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; n(n-1)(n-2) &amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма —&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{3\,n(n-1)}{2} &amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt; \frac{5\,n(n-1)}{2} &amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt; n(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;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4731</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4731"/>
		<updated>2016-10-07T22:31:53Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= (a_{jj}-a{kk})/(2\,a_{jk}) \\&lt;br /&gt;
      t &amp;amp;= sign(\tau)/(|\tau|+\sqrt{1+\tau^2}) \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\,A\,R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4730</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4730"/>
		<updated>2016-10-07T22:30:51Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; -\sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta)  &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;               &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= (a_{jj}-a{kk})/(2\,a_{jk}) \\&lt;br /&gt;
      t &amp;amp;= sign(\tau)/(|\tau|+\sqrt{1+\tau^2}) \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\,A\,R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4729</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4729"/>
		<updated>2016-10-07T17:53:58Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
Алгоритм можно описать следующим образом:&lt;br /&gt;
 repeat&lt;br /&gt;
     for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
         for &amp;lt;math&amp;gt;k=j+1&amp;lt;/math&amp;gt; to &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
             выполнить процедуру &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
         end for&lt;br /&gt;
     end for&lt;br /&gt;
 пока &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039; — это следующий алгоритм:&lt;br /&gt;
 if &amp;lt;math&amp;gt;|a_{jk}|&amp;lt;/math&amp;gt; не слишком мал&lt;br /&gt;
     &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
      \tau &amp;amp;= (a_{jj}-a{kk})/(2\,a_{jk}) \\&lt;br /&gt;
      t &amp;amp;= sign(\tau)/(|\tau|+\sqrt{1+\tau^2}) \\&lt;br /&gt;
      c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
      s &amp;amp;= c\,t \\&lt;br /&gt;
      A &amp;amp;= R^T(j,k,\theta)\,A\,R(j,k,\theta), \qquad J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4728</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4728"/>
		<updated>2016-10-07T17:26:06Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Основную часть метода составляет процедура применения вращения к матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, которая в дальнейшем будет обозначена как &#039;&#039;&#039;&#039;&#039;Jakobi-Rotation&amp;lt;math&amp;gt;(A,j,k)&amp;lt;/math&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4727</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4727"/>
		<updated>2016-10-07T17:20:08Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выбор параметров &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; производится путем построчного циклического обхода внедиагональных элементов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4726</id>
		<title>Участник:Galkina/Метод Якоби вычисления собственных значений симметричной матрицы</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:Galkina/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=4726"/>
		<updated>2016-10-07T17:08:00Z</updated>

		<summary type="html">&lt;p&gt;Игорь: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[Участник: Galkina|А.С.Галкина]], [[Участник: Plahov|И.А.Плахов]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Метод Якоби — итерационный алгоритм для вычисления собственных значений и собственных векторов вещественной симметричной матрицы. Карл Густав Якоб Якоби, в честь которого назван этот метод, предложил его в 1846 году, хотя использоваться он начал только в 1950-х годах с появлением компьютеров. Суть алгоритма заключается в том, чтобы по заданной симметрической матрице &amp;lt;math&amp;gt;A = A_0&amp;lt;/math&amp;gt; построить последовательность ортогонально подобных матриц &amp;lt;math&amp;gt;A_1,A_2,...&amp;lt;/math&amp;gt;. Эта последовательность сходится к диагональной матрице, на диагонали которой стоят собственные значения.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; получается из &amp;lt;math&amp;gt;A_i&amp;lt;/math&amp;gt; по формуле &amp;lt;math&amp;gt;A_{i+1}={J_i}^TA_iJ_i&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; — ортогональная матрица, называемая &#039;&#039;вращением Якоби&#039;&#039;.&lt;br /&gt;
При подходящем выборе &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; матрица &amp;lt;math&amp;gt;A_m&amp;lt;/math&amp;gt; для больших m будет близка к диагональной матрице &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы сделать нулями пару внедиагональных элементов матрицы &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- полноценный TEX, похоже, не поддерживается =( --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
J_i = &lt;br /&gt;
\begin{matrix}&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
j \\&lt;br /&gt;
  \\&lt;br /&gt;
k \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
  \\&lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;  &lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  &amp;amp; 1 &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp; 1 &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp; \ddots &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp; \ddots &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp; \sin(\theta) &amp;amp;        &amp;amp; \cos(\theta) &amp;amp;         &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp; \ddots  &amp;amp;    &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp; 1  &amp;amp;   \\&lt;br /&gt;
  &amp;amp;   &amp;amp;   &amp;amp;        &amp;amp;              &amp;amp;        &amp;amp;              &amp;amp;         &amp;amp;    &amp;amp; 1 \\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обозначим &amp;lt;math&amp;gt;s = \sin \theta&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;c = \cos \theta&amp;lt;/math&amp;gt;. Тогда матрица &amp;lt;math&amp;gt;A_{i+1}&amp;lt;/math&amp;gt; состоит из следующих элементов:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jj}^{(i+1)} &amp;amp;= c^2\, a_{jj}^{(i)}  -  2\, s c \,a_{jk}^{(i)}  +  s^2\, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{kk}^{(i+1)} &amp;amp;= s^2 \,a_{jj}^{(i)}  +  2 s c\, a_{jk}^{(i)}  +  c^2 \, a_{kk}^{(i)} \\&lt;br /&gt;
 a_{jk}^{(i+1)} &amp;amp;= a_{kj}^{(i+1)} = (c^2 - s^2 ) \, a_{jk}^{(i)}  +  s c \, (a_{kk}^{(i)} - a_{jj}^{(i)} ) \\&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{ml}^{(i+1)} &amp;amp;= a_{ml}^{(i)} &amp;amp;m,l \ne j,k&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можно выбрать &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; так, чтобы &amp;lt;math&amp;gt;a_{jk}^{(i+1)} = 0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;a_{kj}^{(i+1)} = 0&amp;lt;/math&amp;gt;. Для этого запишем равенство&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix}^T &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i)} &amp;amp; a_{jk}^{(i)} \\&lt;br /&gt;
  a_{kj}^{(i)} &amp;amp; a_{kk}^{(i)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \cos(\theta) &amp;amp; -\sin(\theta) \\&lt;br /&gt;
  \sin(\theta) &amp;amp; \cos(\theta)&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\lambda_2&amp;lt;/math&amp;gt; - собственные значения подматрицы&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{bmatrix}&lt;br /&gt;
  a_{jj}^{(i+1)} &amp;amp; a_{jk}^{(i+1)} \\&lt;br /&gt;
  a_{kj}^{(i+1)} &amp;amp; a_{kk}^{(i+1)}&lt;br /&gt;
\end{bmatrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Опуская индекс &amp;lt;math&amp;gt;(i)&amp;lt;/math&amp;gt;, с учетом симметрии получим:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  \lambda_1 &amp;amp; 0 \\&lt;br /&gt;
  0 &amp;amp; \lambda_2&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
= &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
  a_{jj}c^2 + a_{kk}s^2 + 2sca_{jk} &amp;amp; sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) \\&lt;br /&gt;
  sc(a_{kk}-a_{jj})+a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2 + a_{kk}c^2 - 2sca_{jk}&lt;br /&gt;
\end{bmatrix} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приравнивая внедиагональный элемент нулю, получаем&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; \frac{a_{jj}^{(i)} - a_{kk}^{(i)}}{2 a_{jk}^{(i)}} = \frac{c^2 - s^2}{2sc} = \frac{\cos 2\theta}{\sin 2\theta} = \operatorname{tg}(2\theta) \equiv \tau &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;t = \frac{s}{c} = \operatorname{ctg}(\theta)&amp;lt;/math&amp;gt; и заметим, что &amp;lt;math&amp;gt;t^2 - 2t\tau + 1 = 0&amp;lt;/math&amp;gt;. Решая квадратное уравнение, находим &amp;lt;math&amp;gt;t = \frac{\operatorname{sign}(\tau)}{|\tau| + \sqrt{1+\tau^2}}, c = \frac{1}{\sqrt{1+t^2}}, s = tc&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро составляют множественные вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jm}^{(i+1)} = a_{mj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{km}^{(i+1)} = a_{mk}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; в процессе применения матрицы поворота  &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; к матрице  &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
 a_{jm}^{(i+1)} &amp;amp;= a_{mj}^{(i+1)} = c \, a_{jm}^{(i)}  -  s \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
 a_{km}^{(i+1)} &amp;amp;= a_{mk}^{(i+1)} = s \, a_{jm}^{(i)}  + c \, a_{km}^{(i)} &amp;amp; m \ne j,k \\&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по &amp;lt;math&amp;gt; (n-2) &amp;lt;/math&amp;gt; раза.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&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;: диагональная матрица &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;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; (достаточно хранить только диагональные элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Игорь</name></author>
	</entry>
</feed>