<?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=Akukhtinov</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=Akukhtinov"/>
	<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/Akukhtinov"/>
	<updated>2026-10-22T15:52:55Z</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11686</id>
		<title>Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11686"/>
		<updated>2016-10-15T20:11:50Z</updated>

		<summary type="html">&lt;p&gt;Akukhtinov: /* Информационный граф */&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;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]], [[Участник:AKukhtinov|А. Кухтинов]].&lt;br /&gt;
&lt;br /&gt;
=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его для конкретной матрицы 7 × 7 в 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-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;. Диагональные элементы  &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, столбцы — приближенные собственные вектора матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&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,\ldots, A_m&amp;lt;/math&amp;gt;, сходящихся к &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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; — ортогональная матрица, называемая вращением Якоби.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы обнулить элементы &amp;lt;math&amp;gt;(j,k)&amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt;(k,j)&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
\begin{align}&lt;br /&gt;
J_i = R(j,k,\theta) = \begin{matrix} \\ \\ \\ j \\ \\ k \\ \\ \\ \\ \end{matrix}  \begin{bmatrix} &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; -\sin(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \sin(\theta) &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 \\ \end{bmatrix}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для угла вращения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}a^{(i+1)}_{jj} &amp;amp; a^{(i+1)}_{jk} \\ a^{(i+1)}_{kj} &amp;amp; a^{(i+1)}_{kk}\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}^{T}&lt;br /&gt;
\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix},&amp;lt;/math&amp;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; — собственные значения подматрицы &amp;lt;math&amp;gt;\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&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;, исходя из предыдущего матричного равенства:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}a_{jj}c^2+a_{kk}s^2+2sca_{jk} &amp;amp; sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) \\ sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2+a_{kk}c^2 - 2sca_{jk} \end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приравняем внедиагональный элемент нулю:&lt;br /&gt;
&amp;lt;math&amp;gt;\dfrac{a_{jj}-a_{kk}}{2a_{jk}}=\dfrac{c^2-s^2}{2sc}=\dfrac{\cos2\theta}{\sin2\theta}=\operatorname{ctg}2\theta\equiv\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;tg\theta=t=\dfrac{s}{c}&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;t^2+2t\tau-1=0&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решая квадратное уравнение, получим:&lt;br /&gt;
&amp;lt;math&amp;gt;t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.&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;J&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
1. Вычисления элементов &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt;   и   &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)}&amp;lt;/math&amp;gt; (каждое &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раз):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k;\\&lt;br /&gt;
a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k.&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;: &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;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246, алгоритм 5.6)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
  выбрать пару индексов j, k&lt;br /&gt;
  обратиться к процедуре JacobiRotation(A,j,k)&lt;br /&gt;
 пока А не станет достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди &amp;lt;math&amp;gt;\dfrac{n^2-n}{2}&amp;lt;/math&amp;gt; элементов, прежде чем выполнить вращение стоимостью в &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;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;
Таким образом, алгоритм можно описать так&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 247, алгоритм 5.8)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
    for j=1 to n-1&lt;br /&gt;
        for k=j+1 to n&lt;br /&gt;
            выполнить процедуру &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;&lt;br /&gt;
        end for&lt;br /&gt;
    end for&lt;br /&gt;
 пока A не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;:&lt;br /&gt;
&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\cdot t \\&lt;br /&gt;
      A &amp;amp;= J_i^T\cdot A\cdot J_i, \qquad&lt;br /&gt;
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
Для одной итерации вычислений собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4\,n+6&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
*&amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4&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;4&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;
1. &#039;&#039;&#039;&#039;&#039;Off&amp;gt;eps&#039;&#039;&#039;&#039;&#039; — сравнение матрицы с диагональной: вычисление нормы наддиагональных элементов &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;\epsilon&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&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;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы (&amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt;);&lt;br /&gt;
*&amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; — элемент входных данных.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039; — вычисление &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; согласно формулам в [[#Схема реализации последовательного алгоритма|схеме реализации последовательного алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
*&amp;lt;math&amp;gt;a^{(i+1)}_{jj}, a^{(i+1)}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных: диагональные элементы матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i+1)}_{jk}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результаты выполнения функции являются &#039;&#039;промежуточными данными&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{(i+1)}_{jj}, a^{(i+1)}_{kk}&amp;lt;/math&amp;gt; согласно формулам в разделе [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]]. &lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i)}_{jj}, a^{(i)}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i)}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;выходным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{(i+1)}_{jl},a^{(i+1)}_{kl},l\ne j,k&amp;lt;/math&amp;gt; согласно формулам в разделе [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].  &lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i)}_{jl}, a^{(i)}_{kl}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jl},l\ne j,k&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма. (Считается, что алгоритм вычисляет только собственные значения. При вычислении собственных векторов эти данные также были бы  &#039;&#039;выходными&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Описанный граф для четырех итераций представлен на рисунке. К графу добавлены вершины, соответствующие входным (желтый цвет) и выходным (фиолетовый цвет) данным. Дублирующие друг друга дуги даны как одна.&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Для выполнения каждой итерации требуется последовательно выполнить следующие ярусы (для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;):&lt;br /&gt;
# Вычислить норму матрицы и сравнить с &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;  (параллельное вычисление &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; умножений, далее последовательно  &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция взятия квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения )&lt;br /&gt;
&lt;br /&gt;
# Вычислить  &amp;lt;math&amp;gt;\tau, t, c, s&amp;lt;/math&amp;gt; (последовательно всего &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;  умножений, &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt; делений, &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; сложений (вычитаний), &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; операции извлечения квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения, &amp;lt;math&amp;gt;1&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;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(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;lt;math&amp;gt;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;
&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности  &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;. Один цикл (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
1. Плотная матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}, A\in\R^{n\times n}&amp;lt;/math&amp;gt;. Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — симметрическая матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Число двойной точности &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, определяющее допустимый порядок малости внедиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. &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_{i}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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;
Из существующих алгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным (в среднем для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;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;
Библиотека [https://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html JACOBI_EIGENVALUE] содержит последовательную реализацию алгоритма.&lt;br /&gt;
&lt;br /&gt;
Существует также [http://ieeexplore.ieee.org/document/6310877/ параллельная реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akukhtinov</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11600</id>
		<title>Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11600"/>
		<updated>2016-10-15T19:58:39Z</updated>

		<summary type="html">&lt;p&gt;Akukhtinov: /* Информационный граф */&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;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]], [[Участник:AKukhtinov|А. Кухтинов]].&lt;br /&gt;
&lt;br /&gt;
=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его для конкретной матрицы 7 × 7 в 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-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;. Диагональные элементы  &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, столбцы — приближенные собственные вектора матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&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,\ldots, A_m&amp;lt;/math&amp;gt;, сходящихся к &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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; — ортогональная матрица, называемая вращением Якоби.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы обнулить элементы &amp;lt;math&amp;gt;(j,k)&amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt;(k,j)&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
\begin{align}&lt;br /&gt;
J_i = R(j,k,\theta) = \begin{matrix} \\ \\ \\ j \\ \\ k \\ \\ \\ \\ \end{matrix}  \begin{bmatrix} &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; -\sin(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \sin(\theta) &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 \\ \end{bmatrix}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для угла вращения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}a^{(i+1)}_{jj} &amp;amp; a^{(i+1)}_{jk} \\ a^{(i+1)}_{kj} &amp;amp; a^{(i+1)}_{kk}\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}^{T}&lt;br /&gt;
\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix},&amp;lt;/math&amp;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; — собственные значения подматрицы &amp;lt;math&amp;gt;\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&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;, исходя из предыдущего матричного равенства:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}a_{jj}c^2+a_{kk}s^2+2sca_{jk} &amp;amp; sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) \\ sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2+a_{kk}c^2 - 2sca_{jk} \end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приравняем внедиагональный элемент нулю:&lt;br /&gt;
&amp;lt;math&amp;gt;\dfrac{a_{jj}-a_{kk}}{2a_{jk}}=\dfrac{c^2-s^2}{2sc}=\dfrac{\cos2\theta}{\sin2\theta}=\operatorname{ctg}2\theta\equiv\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;tg\theta=t=\dfrac{s}{c}&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;t^2+2t\tau-1=0&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решая квадратное уравнение, получим:&lt;br /&gt;
&amp;lt;math&amp;gt;t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.&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;J&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
1. Вычисления элементов &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt;   и   &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)}&amp;lt;/math&amp;gt; (каждое &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раз):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k;\\&lt;br /&gt;
a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k.&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;: &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;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246, алгоритм 5.6)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
  выбрать пару индексов j, k&lt;br /&gt;
  обратиться к процедуре JacobiRotation(A,j,k)&lt;br /&gt;
 пока А не станет достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди &amp;lt;math&amp;gt;\dfrac{n^2-n}{2}&amp;lt;/math&amp;gt; элементов, прежде чем выполнить вращение стоимостью в &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;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;
Таким образом, алгоритм можно описать так&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 247, алгоритм 5.8)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
    for j=1 to n-1&lt;br /&gt;
        for k=j+1 to n&lt;br /&gt;
            выполнить процедуру &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;&lt;br /&gt;
        end for&lt;br /&gt;
    end for&lt;br /&gt;
 пока A не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;:&lt;br /&gt;
&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\cdot t \\&lt;br /&gt;
      A &amp;amp;= J_i^T\cdot A\cdot J_i, \qquad&lt;br /&gt;
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
Для одной итерации вычислений собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4\,n+6&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
*&amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4&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;4&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;
1. &#039;&#039;&#039;&#039;&#039;Off&amp;gt;eps&#039;&#039;&#039;&#039;&#039; — сравнение матрицы с диагональной: вычисление нормы наддиагональных элементов &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;\epsilon&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&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;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы (&amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt;);&lt;br /&gt;
*&amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; — элемент входных данных.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039; — вычисление &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; согласно формулам в [[#Схема реализации последовательного алгоритма|схеме реализации последовательного алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
*&amp;lt;math&amp;gt;a^{i+1}_{jj}, a^{i+1}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных: диагональные элементы матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i+1}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результаты выполнения функции являются &#039;&#039;промежуточными данными&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{i+1}_{jj}, a^{i+1}_{kk}&amp;lt;/math&amp;gt; согласно формулам в разделе [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i}_{jj}, a^{i}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы &amp;lt;math&amp;gt;a^{i}_{jj}, a^{i}_{kk}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;выходным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt; согласно формулам в разделе [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i)}_{jl}, a^{(i)}_{kl}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jl},l\ne j,k&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма. (Считается, что алгоритм вычисляет только собственные значения. При вычислении собственных векторов эти данные также были бы  &#039;&#039;выходными&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Описанный граф для четырех итераций представлен на рисунке. К графу добавлены вершины, соответствующие входным (желтый цвет) и выходным (фиолетовый цвет) данным. Дублирующие друг друга дуги даны как одна.&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Для выполнения каждой итерации требуется последовательно выполнить следующие ярусы (для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;):&lt;br /&gt;
# Вычислить норму матрицы и сравнить с &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;  (параллельное вычисление &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; умножений, далее последовательно  &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция взятия квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения )&lt;br /&gt;
&lt;br /&gt;
# Вычислить  &amp;lt;math&amp;gt;\tau, t, c, s&amp;lt;/math&amp;gt; (последовательно всего &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;  умножений, &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt; делений, &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; сложений (вычитаний), &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; операции извлечения квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения, &amp;lt;math&amp;gt;1&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;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(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;lt;math&amp;gt;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;
&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности  &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;. Один цикл (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
1. Плотная матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}, A\in\R^{n\times n}&amp;lt;/math&amp;gt;. Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — симметрическая матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Число двойной точности &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, определяющее допустимый порядок малости внедиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. &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_{i}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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;
Из существующих алгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным (в среднем для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;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;
Библиотека [https://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html JACOBI_EIGENVALUE] содержит последовательную реализацию алгоритма.&lt;br /&gt;
&lt;br /&gt;
Существует также [http://ieeexplore.ieee.org/document/6310877/ параллельная реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akukhtinov</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11569</id>
		<title>Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11569"/>
		<updated>2016-10-15T19:53:03Z</updated>

		<summary type="html">&lt;p&gt;Akukhtinov: &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;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]], [[Участник:AKukhtinov|А. Кухтинов]].&lt;br /&gt;
&lt;br /&gt;
=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его для конкретной матрицы 7 × 7 в 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-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;. Диагональные элементы  &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, столбцы — приближенные собственные вектора матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&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,\ldots, A_m&amp;lt;/math&amp;gt;, сходящихся к &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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; — ортогональная матрица, называемая вращением Якоби.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы обнулить элементы &amp;lt;math&amp;gt;(j,k)&amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt;(k,j)&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
\begin{align}&lt;br /&gt;
J_i = R(j,k,\theta) = \begin{matrix} \\ \\ \\ j \\ \\ k \\ \\ \\ \\ \end{matrix}  \begin{bmatrix} &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; -\sin(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \sin(\theta) &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 \\ \end{bmatrix}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для угла вращения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}a^{(i+1)}_{jj} &amp;amp; a^{(i+1)}_{jk} \\ a^{(i+1)}_{kj} &amp;amp; a^{(i+1)}_{kk}\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}^{T}&lt;br /&gt;
\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix},&amp;lt;/math&amp;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; — собственные значения подматрицы &amp;lt;math&amp;gt;\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&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;, исходя из предыдущего матричного равенства:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}a_{jj}c^2+a_{kk}s^2+2sca_{jk} &amp;amp; sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) \\ sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2+a_{kk}c^2 - 2sca_{jk} \end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приравняем внедиагональный элемент нулю:&lt;br /&gt;
&amp;lt;math&amp;gt;\dfrac{a_{jj}-a_{kk}}{2a_{jk}}=\dfrac{c^2-s^2}{2sc}=\dfrac{\cos2\theta}{\sin2\theta}=\operatorname{ctg}2\theta\equiv\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;tg\theta=t=\dfrac{s}{c}&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;t^2+2t\tau-1=0&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решая квадратное уравнение, получим:&lt;br /&gt;
&amp;lt;math&amp;gt;t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.&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;J&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
1. Вычисления элементов &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt;   и   &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)}&amp;lt;/math&amp;gt; (каждое &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раз):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k;\\&lt;br /&gt;
a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k.&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;: &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;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246, алгоритм 5.6)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
  выбрать пару индексов j, k&lt;br /&gt;
  обратиться к процедуре JacobiRotation(A,j,k)&lt;br /&gt;
 пока А не станет достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди &amp;lt;math&amp;gt;\dfrac{n^2-n}{2}&amp;lt;/math&amp;gt; элементов, прежде чем выполнить вращение стоимостью в &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;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;
Таким образом, алгоритм можно описать так&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 247, алгоритм 5.8)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
    for j=1 to n-1&lt;br /&gt;
        for k=j+1 to n&lt;br /&gt;
            выполнить процедуру &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;&lt;br /&gt;
        end for&lt;br /&gt;
    end for&lt;br /&gt;
 пока A не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;:&lt;br /&gt;
&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\cdot t \\&lt;br /&gt;
      A &amp;amp;= J_i^T\cdot A\cdot J_i, \qquad&lt;br /&gt;
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
Для одной итерации вычислений собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4\,n+6&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
*&amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4&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;4&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;
1. &#039;&#039;&#039;&#039;&#039;Off&amp;gt;eps&#039;&#039;&#039;&#039;&#039; — сравнение матрицы с диагональной: вычисление нормы наддиагональных элементов &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;\epsilon&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&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; и ;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы (&amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt;);&lt;br /&gt;
*&amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; — элемент входных данных.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039; — вычисление &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; согласно формулам в [[#Схема реализации последовательного алгоритма|схеме реализации последовательного алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
*&amp;lt;math&amp;gt;a^{i+1}_{jj}, a^{i+1}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных: диагональные элементы матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i+1}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результаты выполнения функции являются &#039;&#039;промежуточными данными&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{i+1}_{jj}, a^{i+1}_{kk}&amp;lt;/math&amp;gt; согласно формулам в разделе [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i}_{jj}, a^{i}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы &amp;lt;math&amp;gt;a^{i}_{jj}, a^{i}_{kk}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;выходным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt; согласно формулам в разделе [[#Вычислительное ядро алгоритма|Вычислительное ядро алгоритма]].&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i)}_{jl}, a^{(i)}_{kl}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jl},l\ne j,k&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма. (Считается, что алгоритм вычисляет только собственные значения. При вычислении собственных векторов эти данные также были бы  &#039;&#039;выходными&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Описанный граф для четырех итераций представлен на рисунке. К графу добавлены вершины, соответствующие входным (желтый цвет) и выходным (фиолетовый цвет) данным. Дублирующие друг друга дуги даны как одна.&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Для выполнения каждой итерации требуется последовательно выполнить следующие ярусы (для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;):&lt;br /&gt;
# Вычислить норму матрицы и сравнить с &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;  (параллельное вычисление &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; умножений, далее последовательно  &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция взятия квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения )&lt;br /&gt;
&lt;br /&gt;
# Вычислить  &amp;lt;math&amp;gt;\tau, t, c, s&amp;lt;/math&amp;gt; (последовательно всего &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;  умножений, &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt; делений, &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; сложений (вычитаний), &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; операции извлечения квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения, &amp;lt;math&amp;gt;1&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;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(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;lt;math&amp;gt;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;
&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности  &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;. Один цикл (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
1. Плотная матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}, A\in\R^{n\times n}&amp;lt;/math&amp;gt;. Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — симметрическая матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Число двойной точности &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, определяющее допустимый порядок малости внедиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. &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_{i}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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;
Из существующих алгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным (в среднем для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;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;
Библиотека [https://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html JACOBI_EIGENVALUE] содержит последовательную реализацию алгоритма.&lt;br /&gt;
&lt;br /&gt;
Существует также [http://ieeexplore.ieee.org/document/6310877/ параллельная реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akukhtinov</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11558</id>
		<title>Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=11558"/>
		<updated>2016-10-15T19:51:01Z</updated>

		<summary type="html">&lt;p&gt;Akukhtinov: &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;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]], [[Участник:AKukhtinov|А. Кухтинов]].&lt;br /&gt;
&lt;br /&gt;
=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его для конкретной матрицы 7 × 7 в 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-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;. Диагональные элементы  &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, столбцы — приближенные собственные вектора матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&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,\ldots, A_m&amp;lt;/math&amp;gt;, сходящихся к &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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; — ортогональная матрица, называемая вращением Якоби.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы обнулить элементы &amp;lt;math&amp;gt;(j,k)&amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt;(k,j)&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
\begin{align}&lt;br /&gt;
J_i = R(j,k,\theta) = \begin{matrix} \\ \\ \\ j \\ \\ k \\ \\ \\ \\ \end{matrix}  \begin{bmatrix} &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; -\sin(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \sin(\theta) &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 \\ \end{bmatrix}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для угла вращения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}a^{(i+1)}_{jj} &amp;amp; a^{(i+1)}_{jk} \\ a^{(i+1)}_{kj} &amp;amp; a^{(i+1)}_{kk}\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}^{T}&lt;br /&gt;
\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix},&amp;lt;/math&amp;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; — собственные значения подматрицы &amp;lt;math&amp;gt;\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&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;, исходя из предыдущего матричного равенства:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}a_{jj}c^2+a_{kk}s^2+2sca_{jk} &amp;amp; sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) \\ sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2+a_{kk}c^2 - 2sca_{jk} \end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приравняем внедиагональный элемент нулю:&lt;br /&gt;
&amp;lt;math&amp;gt;\dfrac{a_{jj}-a_{kk}}{2a_{jk}}=\dfrac{c^2-s^2}{2sc}=\dfrac{\cos2\theta}{\sin2\theta}=\operatorname{ctg}2\theta\equiv\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;tg\theta=t=\dfrac{s}{c}&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;t^2+2t\tau-1=0&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решая квадратное уравнение, получим:&lt;br /&gt;
&amp;lt;math&amp;gt;t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.&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;J&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
1. Вычисления элементов &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt;   и   &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)}&amp;lt;/math&amp;gt; (каждое &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раз):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k;\\&lt;br /&gt;
a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k.&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;: &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;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246, алгоритм 5.6)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
  выбрать пару индексов j, k&lt;br /&gt;
  обратиться к процедуре JacobiRotation(A,j,k)&lt;br /&gt;
 пока А не станет достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди &amp;lt;math&amp;gt;\dfrac{n^2-n}{2}&amp;lt;/math&amp;gt; элементов, прежде чем выполнить вращение стоимостью в &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;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;
Таким образом, алгоритм можно описать так&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 247, алгоритм 5.8)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
    for j=1 to n-1&lt;br /&gt;
        for k=j+1 to n&lt;br /&gt;
            выполнить процедуру &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;&lt;br /&gt;
        end for&lt;br /&gt;
    end for&lt;br /&gt;
 пока A не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;:&lt;br /&gt;
&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\cdot t \\&lt;br /&gt;
      A &amp;amp;= J_i^T\cdot A\cdot J_i, \qquad&lt;br /&gt;
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
Для одной итерации вычислений собственных значений матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4\,n+6&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
*&amp;lt;math&amp;gt;2n&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
Для остальной части алгоритма:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;4&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;4&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;
1. &#039;&#039;&#039;&#039;&#039;Off&amp;gt;eps&#039;&#039;&#039;&#039;&#039; — сравнение матрицы с диагональной: вычисление нормы наддиагональных элементов &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;\epsilon&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&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; и ;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы (&amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt;);&lt;br /&gt;
*&amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; — элемент входных данных.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039; — вычисление &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; согласно формулам в [[#Схема реализации последовательного алгоритма|схеме реализации последовательного алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
*&amp;lt;math&amp;gt;a^{i+1}_{jj}, a^{i+1}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных: диагональные элементы матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i+1}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результаты выполнения функции являются &#039;&#039;промежуточными данными&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{i+1}_{jj}, a^{i+1}_{kk}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i}_{jj}, a^{i}_{kk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины третьей группы &amp;lt;math&amp;gt;a^{i}_{jj}, a^{i}_{kk}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{i}_{jk}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;выходным данным&#039;&#039; алгоритма.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; — вычисление &amp;lt;math&amp;gt;a^{i+1}_{jl},a^{i+1}_{kl},l\ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Аргументы функции:&lt;br /&gt;
* &amp;lt;math&amp;gt;c, s&amp;lt;/math&amp;gt; — результаты вычислений вершины второй группы.&lt;br /&gt;
* &amp;lt;math&amp;gt;a^{(i)}_{jl}, a^{(i)}_{kl}&amp;lt;/math&amp;gt;:&lt;br /&gt;
** Первая итерация — элементы входных данных &amp;lt;math&amp;gt;a_{jl},l\ne j,k&amp;lt;/math&amp;gt;;&lt;br /&gt;
** Последующие — результаты вычислений вершины четвертой группы.&lt;br /&gt;
&lt;br /&gt;
Результат выполнения функции является &#039;&#039;промежуточным данным&#039;&#039; алгоритма. (Считается, что алгоритм вычисляет только собственные значения. При вычислении собственных векторов эти данные также были бы  &#039;&#039;выходными&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Описанный граф для четырех итераций представлен на рисунке. К графу добавлены вершины, соответствующие входным (желтый цвет) и выходным (фиолетовый цвет) данным. Дублирующие друг друга дуги даны как одна.&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма с отображением входных и выходных данных.]]&lt;br /&gt;
&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Для выполнения каждой итерации требуется последовательно выполнить следующие ярусы (для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;):&lt;br /&gt;
# Вычислить норму матрицы и сравнить с &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;  (параллельное вычисление &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; умножений, далее последовательно  &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt; сложений, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция взятия квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения )&lt;br /&gt;
&lt;br /&gt;
# Вычислить  &amp;lt;math&amp;gt;\tau, t, c, s&amp;lt;/math&amp;gt; (последовательно всего &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt;  умножений, &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt; делений, &amp;lt;math&amp;gt;4&amp;lt;/math&amp;gt; сложений (вычитаний), &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; операции извлечения квадратного корня, &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операция сравнения, &amp;lt;math&amp;gt;1&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;2(n-2)&amp;lt;/math&amp;gt; операций вычисления элементов матрицы &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt; &amp;amp;nbsp; и &amp;amp;nbsp; &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(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;lt;math&amp;gt;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;
&lt;br /&gt;
&lt;br /&gt;
Суммарное количество итераций зависит от входных данных и заданного значения погрешности  &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;. Один цикл (полный проход по внедиагональным элементам) осуществляется за &amp;lt;math&amp;gt;N = \frac{n(n-1)}{2}&amp;lt;/math&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
1. Плотная матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}, A\in\R^{n\times n}&amp;lt;/math&amp;gt;. Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — симметрическая матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Число двойной точности &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;, определяющее допустимый порядок малости внедиагональных элементов.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. &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_{i}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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;
Из существующих алгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным (в среднем для сходимости метода Якоби требуется от 5 до 10 циклов, что хуже, чем у конкурирующих алгоритмов&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 248)&amp;lt;/ref&amp;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;
Библиотека [https://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html JACOBI_EIGENVALUE] содержит последовательную реализацию алгоритма.&lt;br /&gt;
&lt;br /&gt;
Существует также [http://ieeexplore.ieee.org/document/6310877/ параллельная реализация] метода на платформе CUDA.&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akukhtinov</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=7076</id>
		<title>Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы</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:Akukhtinov/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B4%D0%BB%D1%8F_%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=7076"/>
		<updated>2016-10-14T07:17:39Z</updated>

		<summary type="html">&lt;p&gt;Akukhtinov: Новая страница: «{{algorithm | name              = Метод Якоби вычисления собственных значений симметричной матрицы | ser…»&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         = &lt;br /&gt;
| pf_width          = &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;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]], [[Участник:AKukhtinov|А. Кухтинов]].&lt;br /&gt;
&lt;br /&gt;
=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его для конкретной матрицы 7 × 7 в 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-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 244-245)&amp;lt;/ref&amp;gt;==&lt;br /&gt;
Исходные данные: симметрическая матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: диагональная матрица &amp;lt;math&amp;gt;\Lambda=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;. Диагональные элементы  &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, столбцы — приближенные собственные вектора матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&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,\ldots, A_m&amp;lt;/math&amp;gt;, сходящихся к &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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; — ортогональная матрица, называемая вращением Якоби.&lt;br /&gt;
&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;J_i&amp;lt;/math&amp;gt; выбирается так, чтобы обнулить элементы &amp;lt;math&amp;gt;(j,k)&amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt;(k,j)&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;&lt;br /&gt;
 \begin{matrix}j &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; k \end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
J_i = R(j,k,\theta) = \begin{matrix} \\ \\ j \\ \\ \\ \\ \\k  \\ \\ \end{matrix}  \begin{bmatrix} &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; 1 &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; -\sin(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; \sin(\theta) &amp;amp; &amp;amp; \cos(\theta) &amp;amp; &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 &amp;amp; \\ &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 1 \\ \end{bmatrix}&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для угла вращения &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}a^{(i+1)}_{jj} &amp;amp; a^{(i+1)}_{jk} \\ a^{(i+1)}_{kj} &amp;amp; a^{(i+1)}_{kk}\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}^{T}&lt;br /&gt;
\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}\cos\theta &amp;amp; -\sin\theta \\ \sin\theta &amp;amp;\cos\theta\end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix},&amp;lt;/math&amp;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; — собственные значения подматрицы &amp;lt;math&amp;gt;\begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}&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;, исходя из предыдущего матричного равенства:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}\lambda_1 &amp;amp; 0 \\ 0 &amp;amp; \lambda_2 \end{bmatrix}=&lt;br /&gt;
\begin{bmatrix}a_{jj}c^2+a_{kk}s^2+2sca_{jk} &amp;amp; sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) \\ sc(a_{kk} - a_{jj}) + a_{jk}(c^2-s^2) &amp;amp; a_{jj}s^2+a_{kk}c^2 - 2sca_{jk} \end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приравняем внедиагональный элемент нулю:&lt;br /&gt;
&amp;lt;math&amp;gt;\dfrac{a_{jj}-a_{kk}}{2a_{jk}}=\dfrac{c^2-s^2}{2sc}=\dfrac{\cos2\theta}{\sin2\theta}=\operatorname{ctg}2\theta\equiv\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Положим &amp;lt;math&amp;gt;tg\theta=t=\dfrac{s}{c}&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;t^2+2t\tau-1=0&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решая квадратное уравнение, получим:&lt;br /&gt;
&amp;lt;math&amp;gt;t=\dfrac{\operatorname{sign}\tau}{\left|\tau\right|+\sqrt{1+\tau^2}}, c=\dfrac{1}{\sqrt{1+t^2}}, s=t\cdot c.&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;J&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
1. Вычисления элементов &amp;lt;math&amp;gt;a_{jl}^{(i+1)} = a_{lj}^{(i+1)}&amp;lt;/math&amp;gt;   и   &amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)}&amp;lt;/math&amp;gt; (каждое &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раз):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
a_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k;\\&lt;br /&gt;
a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k.&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&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;: &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;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 246, алгоритм 5.6)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
  выбрать пару индексов j, k&lt;br /&gt;
  обратиться к процедуре JacobiRotation(A,j,k)&lt;br /&gt;
 пока А не станет достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
В классическом алгоритме Якоби для обнуления на текущей итерации выбирался наибольший элемент &amp;lt;math&amp;gt;a_{jk}&amp;lt;/math&amp;gt;. Поиск наибольшего элемента слишком замедляет процесс вычислений (нужно провести поиск среди &amp;lt;math&amp;gt;\dfrac{n^2-n}{2}&amp;lt;/math&amp;gt; элементов, прежде чем выполнить вращение стоимостью в &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;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;
Таким образом, алгоритм можно описать так&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 247, алгоритм 5.8)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 repeat&lt;br /&gt;
    for j=1 to n-1&lt;br /&gt;
        for k=j+1 to n&lt;br /&gt;
            выполнить процедуру &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;&lt;br /&gt;
        end for&lt;br /&gt;
    end for&lt;br /&gt;
 пока A не достаточно близка к диагональной матрице&lt;br /&gt;
&lt;br /&gt;
Процедура &#039;&#039;&#039;&#039;&#039;JacobiRotation&#039;&#039;&#039;(A, j, k)&#039;&#039;:&lt;br /&gt;
&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\cdot t \\&lt;br /&gt;
      A &amp;amp;= J_i^T\cdot A\cdot J_i, \qquad&lt;br /&gt;
      J_i = R(j,k,\theta),\ c = \cos \theta,\ s = \sin \theta &lt;br /&gt;
     \end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
 end if&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
Для вычисления собственных значений вещественной симметричной матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; методом Якоби требуется:&lt;br /&gt;
&lt;br /&gt;
Для вычислительного ядра:&lt;br /&gt;
&lt;br /&gt;
*&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;
&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#039;&#039;кубической сложностью&#039;&#039;.&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{a_{ij}\}, A\in\R^{n\times n}&amp;lt;/math&amp;gt;. Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — симметрическая матрица, т. е. &amp;lt;math&amp;gt;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_{i}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&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;
Библиотека [https://people.sc.fsu.edu/~jburkardt/f_src/jacobi_eigenvalue/jacobi_eigenvalue.html JACOBI_EIGENVALUE] содержит последовательную реализацию алгоритма.&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akukhtinov</name></author>
	</entry>
</feed>