<?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=Tameeva.a</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=Tameeva.a"/>
	<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/Tameeva.a"/>
	<updated>2026-10-22T15:52:58Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=21405</id>
		<title>Обсуждение участницы:Tameeva.a</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=21405"/>
		<updated>2016-12-19T15:45:00Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* По существу (возможны добавления по вычитывании) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу (возможны добавления по вычитывании) ===&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;math&amp;gt;a_{jj}-a_{kk} = 0&amp;lt;/math&amp;gt;? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:43, 8 ноября 2016 (MSK)&lt;br /&gt;
** Тогда &amp;lt;math&amp;gt;c=1, s=0 \Rightarrow a_{jl}, a_{kl}, a_{jj}, a_{kk}&amp;lt;/math&amp;gt; не изменяются на этой итерации. Имеет смысл поставить проверку, чтобы сразу переходить к следующей итерации.&lt;br /&gt;
*** В корне неверно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:22, 17 декабря 2016 (MSK)&lt;br /&gt;
**** Для &amp;lt;math&amp;gt;a_{jj}=a_{kk} \qquad \theta=\dfrac{\pi}{4}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;s=c=\dfrac{\sqrt{2}}{2}&amp;lt;/math&amp;gt;. Внесены изменения в статью для этого случая. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 18:44, 19 декабря 2016 (MSK)&lt;br /&gt;
* Более существенно - нельзя ли использовать какие-то свойства и частично получить параллелизм между итерациями? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:09, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
* Отсутствуют заголовки пунктов 2.2-2.6, соответственно пункт 2.1 должен иметь нумерацию 2.4, а пункт 2.2 должен иметь нумерацию 2.7. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* Представленное на рис.1 не является графом алгоритма: по определению в нём не должно быть управляющих вершин, также не вполне понятны вершины с данными; непонятны также разноцветные дуги. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
** Граф на рис.1 является малопонятным - структура вычислений не показана и спрятана в макровершинах, зелёные макровершины почему-то имеют то один вход, то два, а то три - они каждый раз соответствуют разным вычислениям? И почему на рисунке 3 оси, хотя граф выглядит совершенно двумерным? Чему вообще соответствуют эти оси? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
# Граф упрощен до версии без управляющих вершин и входных и выходных данных.&lt;br /&gt;
# Дуги окрашены в цвет вершин, из которых выходят (при изображении графа руководствовались [https://algowiki-project.org/ru/Стандарт_визуализации_ГА стандартом визуализации ГА]: &amp;quot;Цвет любой дуги графа рекомендуется задавать в соответствии с цветом вершины операции, из которой выходит эта дуга.&amp;quot;)&lt;br /&gt;
# Добавлены рис. 2–4 с внутренней структурой макровершин.&lt;br /&gt;
# Различное количество входов имеют зеленые вершины различных типов (с вычислением &amp;lt;math&amp;gt;A_{jj, kk}&amp;lt;/math&amp;gt; и с вычислением &amp;lt;math&amp;gt;A_{jl,kl}&amp;lt;/math&amp;gt;). Также на второй и последующих итерациях используются только предыдущие вычисления, а на первой могут использоваться и входные значения, не обозначенные на графе. В описании графа отображена разница входных и выходных данных каждой вершины для первой и последующих итераций.&lt;br /&gt;
# Ось Х – выполнение операций внутри каждой итерации, ось Y – итерации. Ось Z введена (возможно, несколько искусственно) для отражения параллельности вычисления зеленых вершин. Таким образом, каждая группа вершин одной итерации расположена в плоскости, параллельной OXZ. Возможные исправления: отобразить эти плоскости для каждой итерации (например, пунктиром) либо удалить ось Z. &lt;br /&gt;
[[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.8 все шаги имеют номер 1. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:41, 16 ноября 2016 (MSK)&lt;br /&gt;
**Раздел добавлен [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 12:19, 29 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:05, 30 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Tameeva.a</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=21404</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=21404"/>
		<updated>2016-12-19T15:39:31Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в остальные разделы считаем равным.&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;a_{jj}=a_{kk}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\theta=\dfrac{\pi}{4}&amp;lt;/math&amp;gt;. Тогда &amp;lt;math&amp;gt;s=\dfrac{\sqrt{2}}{2}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;c=\dfrac{\sqrt{2}}{2}&amp;lt;/math&amp;gt;. В противном случае переходим к вычислениям &amp;lt;math&amp;gt;s, c&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;
    if &amp;lt;math&amp;gt;a_{jj}=a_{jk}&amp;lt;/math&amp;gt;&lt;br /&gt;
       &amp;lt;math&amp;gt;\theta=\dfrac{\pi}{4}&amp;lt;/math&amp;gt;&lt;br /&gt;
    end if&lt;br /&gt;
    else&lt;br /&gt;
       &amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
       \tau &amp;amp;= \frac{a_{jj}-a_{kk}}{2\,a_{jk}} \\&lt;br /&gt;
       t &amp;amp;= \frac{sign(\tau)}{|\tau|+\sqrt{1+\tau^2}} \\&lt;br /&gt;
       c &amp;amp;= \frac{1}{\sqrt{1+t^2}} \\&lt;br /&gt;
       s &amp;amp;= c\cdot t&lt;br /&gt;
       \end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
    end else&lt;br /&gt;
 &amp;lt;math&amp;gt;    &lt;br /&gt;
 A = 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;
&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; заключается в последовательном выполнении следующих ярусов:&lt;br /&gt;
&lt;br /&gt;
# Вычисление  &amp;lt;math&amp;gt;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;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным вычислением элементов матрицы &amp;lt;math&amp;gt;a_{jl, kl}^{(i+1)}&amp;lt;/math&amp;gt;, (высота этой части яруса – 2 операции, ширина – &amp;lt;math&amp;gt;4(n-2)&amp;lt;/math&amp;gt;) и элементов &amp;lt;math&amp;gt;a_{jj,kk}^{(i+1)}&amp;lt;/math&amp;gt; (высота этой части яруса – 4 операции, ширина — 5).&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
Использовался компилятор gcc версии 5.2 c флагами -fopenmp и -std=c++0x.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*число процессоров [1 : 48] с шагом 4;&lt;br /&gt;
*размер матрицы [500 : 1500].&lt;br /&gt;
&lt;br /&gt;
[[File:res1.png|800px|thumb|center|Рисунок 5. Зависимость времени выполнения алгоритма от размера матриц и количества процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Из рис. 6 видно, что при 20-24 процессорах производительность максимальная.&lt;br /&gt;
[[File:2d.png|800px|thumb|center|Рисунок 6. Зависимость времени выполнения алгоритма от количества процессоров для фиксированного размера матрицы 500*500.]]&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/edit/cSEYa6ih Реализация на C++ с использованием технологии OpenMP.]&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>Tameeva.a</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=19660</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=19660"/>
		<updated>2016-11-30T15:59:38Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в остальные разделы считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; заключается в последовательном выполнении следующих ярусов:&lt;br /&gt;
&lt;br /&gt;
# Вычисление  &amp;lt;math&amp;gt;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;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным вычислением элементов матрицы &amp;lt;math&amp;gt;a_{jl, kl}^{(i+1)}&amp;lt;/math&amp;gt;, (высота этой части яруса – 2 операции, ширина – &amp;lt;math&amp;gt;4(n-2)&amp;lt;/math&amp;gt;) и элементов &amp;lt;math&amp;gt;a_{jj,kk}^{(i+1)}&amp;lt;/math&amp;gt; (высота этой части яруса – 4 операции, ширина — 5).&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
Использовался компилятор gcc версии 5.2 c флагами -fopenmp и -std=c++0x.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*число процессоров [1 : 48] с шагом 4;&lt;br /&gt;
*размер матрицы [500 : 1500].&lt;br /&gt;
&lt;br /&gt;
[[File:res1.png|800px|thumb|center|Рисунок 5. Зависимость времени выполнения алгоритма от размера матриц и количества процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Из рис. 6 видно, что при 20-24 процессорах производительность максимальная.&lt;br /&gt;
[[File:2d.png|800px|thumb|center|Рисунок 6. Зависимость времени выполнения алгоритма от количества процессоров для фиксированного размера матрицы 500*500.]]&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/edit/cSEYa6ih Реализация на C++ с использованием технологии OpenMP.]&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>Tameeva.a</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=19659</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=19659"/>
		<updated>2016-11-30T15:57:50Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Масштабируемость реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; заключается в последовательном выполнении следующих ярусов:&lt;br /&gt;
&lt;br /&gt;
# Вычисление  &amp;lt;math&amp;gt;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;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным вычислением элементов матрицы &amp;lt;math&amp;gt;a_{jl, kl}^{(i+1)}&amp;lt;/math&amp;gt;, (высота этой части яруса – 2 операции, ширина – &amp;lt;math&amp;gt;4(n-2)&amp;lt;/math&amp;gt;) и элементов &amp;lt;math&amp;gt;a_{jj,kk}^{(i+1)}&amp;lt;/math&amp;gt; (высота этой части яруса – 4 операции, ширина — 5).&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
===Масштабируемость реализации алгоритма===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
Использовался компилятор gcc версии 5.2 c флагами -fopenmp и -std=c++0x.&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*число процессоров [1 : 48] с шагом 4;&lt;br /&gt;
*размер матрицы [500 : 1500].&lt;br /&gt;
&lt;br /&gt;
[[File:res1.png|800px|thumb|center|Рисунок 5. Зависимость времени выполнения алгоритма от размера матриц и количества процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Из рис. 6 видно, что при 20-24 процессорах производительность максимальная.&lt;br /&gt;
[[File:2d.png|800px|thumb|center|Рисунок 6. Зависимость времени выполнения алгоритма от количества процессоров для фиксированного размера матрицы 500*500.]]&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/edit/cSEYa6ih Реализация на C++ с использованием технологии OpenMP.]&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>Tameeva.a</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=19448</id>
		<title>Обсуждение участницы:Tameeva.a</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=19448"/>
		<updated>2016-11-29T09:19:20Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу (возможны добавления по вычитывании) ===&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;math&amp;gt;a_{jj}-a_{kk} = 0&amp;lt;/math&amp;gt;? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:43, 8 ноября 2016 (MSK)&lt;br /&gt;
** Тогда &amp;lt;math&amp;gt;c=1, s=0 \Rightarrow a_{jl}, a_{kl}, a_{jj}, a_{kk}&amp;lt;/math&amp;gt; не изменяются на этой итерации. Имеет смысл поставить проверку, чтобы сразу переходить к следующей итерации.&lt;br /&gt;
* Более существенно - нельзя ли использовать какие-то свойства и частично получить параллелизм между итерациями? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:09, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
* Отсутствуют заголовки пунктов 2.2-2.6, соответственно пункт 2.1 должен иметь нумерацию 2.4, а пункт 2.2 должен иметь нумерацию 2.7. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* Представленное на рис.1 не является графом алгоритма: по определению в нём не должно быть управляющих вершин, также не вполне понятны вершины с данными; непонятны также разноцветные дуги. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
** Граф на рис.1 является малопонятным - структура вычислений не показана и спрятана в макровершинах, зелёные макровершины почему-то имеют то один вход, то два, а то три - они каждый раз соответствуют разным вычислениям? И почему на рисунке 3 оси, хотя граф выглядит совершенно двумерным? Чему вообще соответствуют эти оси? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
# Граф упрощен до версии без управляющих вершин и входных и выходных данных.&lt;br /&gt;
# Дуги окрашены в цвет вершин, из которых выходят (при изображении графа руководствовались [https://algowiki-project.org/ru/Стандарт_визуализации_ГА стандартом визуализации ГА]: &amp;quot;Цвет любой дуги графа рекомендуется задавать в соответствии с цветом вершины операции, из которой выходит эта дуга.&amp;quot;)&lt;br /&gt;
# Добавлены рис. 2–4 с внутренней структурой макровершин.&lt;br /&gt;
# Различное количество входов имеют зеленые вершины различных типов (с вычислением &amp;lt;math&amp;gt;A_{jj, kk}&amp;lt;/math&amp;gt; и с вычислением &amp;lt;math&amp;gt;A_{jl,kl}&amp;lt;/math&amp;gt;). Также на второй и последующих итерациях используются только предыдущие вычисления, а на первой могут использоваться и входные значения, не обозначенные на графе. В описании графа отображена разница входных и выходных данных каждой вершины для первой и последующих итераций.&lt;br /&gt;
# Ось Х – выполнение операций внутри каждой итерации, ось Y – итерации. Ось Z введена (возможно, несколько искусственно) для отражения параллельности вычисления зеленых вершин. Таким образом, каждая группа вершин одной итерации расположена в плоскости, параллельной OXZ. Возможные исправления: отобразить эти плоскости для каждой итерации (например, пунктиром) либо удалить ось Z. &lt;br /&gt;
[[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.8 все шаги имеют номер 1. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:41, 16 ноября 2016 (MSK)&lt;br /&gt;
**Раздел добавлен [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 12:19, 29 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Tameeva.a</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=19419</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=19419"/>
		<updated>2016-11-28T21:05:04Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Масштабируемость реализации алгоритма */&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|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; заключается в последовательном выполнении следующих ярусов:&lt;br /&gt;
&lt;br /&gt;
# Вычисление  &amp;lt;math&amp;gt;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;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным вычислением элементов матрицы &amp;lt;math&amp;gt;a_{jl, kl}^{(i+1)}&amp;lt;/math&amp;gt;, (высота этой части яруса – 2 операции, ширина – &amp;lt;math&amp;gt;4(n-2)&amp;lt;/math&amp;gt;) и элементов &amp;lt;math&amp;gt;a_{jj,kk}^{(i+1)}&amp;lt;/math&amp;gt; (высота этой части яруса – 4 операции, ширина — 5).&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
===Масштабируемость реализации алгоритма===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*число процессоров [1 : 48] с шагом 4;&lt;br /&gt;
*размер матрицы [500 : 1500].&lt;br /&gt;
&lt;br /&gt;
[[File:res1.png|800px|thumb|center|Рисунок 5. Зависимость времени выполнения алгоритма от размера матриц и количества процессоров.]]&lt;br /&gt;
&lt;br /&gt;
Из рис. 6 видно, что при 20-24 процессорах производительность максимальная.&lt;br /&gt;
[[File:2d.png|800px|thumb|center|Рисунок 6. Зависимость времени выполнения алгоритма от количества процессоров для фиксированного размера матрицы 500*500.]]&lt;br /&gt;
&lt;br /&gt;
[http://pastebin.com/edit/cSEYa6ih Реализация на C++.]&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>Tameeva.a</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=19418</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=19418"/>
		<updated>2016-11-28T20:54:51Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; заключается в последовательном выполнении следующих ярусов:&lt;br /&gt;
&lt;br /&gt;
# Вычисление  &amp;lt;math&amp;gt;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;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным вычислением элементов матрицы &amp;lt;math&amp;gt;a_{jl, kl}^{(i+1)}&amp;lt;/math&amp;gt;, (высота этой части яруса – 2 операции, ширина – &amp;lt;math&amp;gt;4(n-2)&amp;lt;/math&amp;gt;) и элементов &amp;lt;math&amp;gt;a_{jj,kk}^{(i+1)}&amp;lt;/math&amp;gt; (высота этой части яруса – 4 операции, ширина — 5).&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
===Масштабируемость алгоритма===&lt;br /&gt;
===Масштабируемость реализации алгоритма===&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
*число процессоров [1 : 48] с шагом 4;&lt;br /&gt;
*размер матрицы [500 : 1500].&lt;br /&gt;
&lt;br /&gt;
[[File:res1.png|800px|thumb|center|Рисунок 5. Зависимость времени выполнения алгоритма от размера матриц и количества процессоров. ]]&lt;br /&gt;
&lt;br /&gt;
Из рис. 6 видно, что при 20-24 процессорах производительность максимальная.&lt;br /&gt;
[[File:2d.png|800px|thumb|center|Рисунок 6. Зависимость времени выполнения алгоритма от количества процессоров для фиксированного размера матрицы 500*500. ]]&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>Tameeva.a</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=18827</id>
		<title>Обсуждение участницы:Tameeva.a</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=18827"/>
		<updated>2016-11-21T17:05:52Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* По существу (возможны добавления по вычитывании) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу (возможны добавления по вычитывании) ===&lt;br /&gt;
&lt;br /&gt;
* Если &amp;lt;math&amp;gt;a_{jj}-a_{kk} = 0&amp;lt;/math&amp;gt;? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:43, 8 ноября 2016 (MSK)&lt;br /&gt;
** Тогда &amp;lt;math&amp;gt;c=1, s=0 \Rightarrow a_{jl}, a_{kl}, a_{jj}, a_{kk}&amp;lt;/math&amp;gt; не изменяются на этой итерации. Имеет смысл поставить проверку, чтобы сразу переходить к следующей итерации.&lt;br /&gt;
* Более существенно - нельзя ли использовать какие-то свойства и частично получить параллелизм между итерациями? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:09, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
* Отсутствуют заголовки пунктов 2.2-2.6, соответственно пункт 2.1 должен иметь нумерацию 2.4, а пункт 2.2 должен иметь нумерацию 2.7. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* Представленное на рис.1 не является графом алгоритма: по определению в нём не должно быть управляющих вершин, также не вполне понятны вершины с данными; непонятны также разноцветные дуги. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
** Граф на рис.1 является малопонятным - структура вычислений не показана и спрятана в макровершинах, зелёные макровершины почему-то имеют то один вход, то два, а то три - они каждый раз соответствуют разным вычислениям? И почему на рисунке 3 оси, хотя граф выглядит совершенно двумерным? Чему вообще соответствуют эти оси? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
# Граф упрощен до версии без управляющих вершин и входных и выходных данных.&lt;br /&gt;
# Дуги окрашены в цвет вершин, из которых выходят (при изображении графа руководствовались [https://algowiki-project.org/ru/Стандарт_визуализации_ГА стандартом визуализации ГА]: &amp;quot;Цвет любой дуги графа рекомендуется задавать в соответствии с цветом вершины операции, из которой выходит эта дуга.&amp;quot;)&lt;br /&gt;
# Добавлены рис. 2–4 с внутренней структурой макровершин.&lt;br /&gt;
# Различное количество входов имеют зеленые вершины различных типов (с вычислением &amp;lt;math&amp;gt;A_{jj, kk}&amp;lt;/math&amp;gt; и с вычислением &amp;lt;math&amp;gt;A_{jl,kl}&amp;lt;/math&amp;gt;). Также на второй и последующих итерациях используются только предыдущие вычисления, а на первой могут использоваться и входные значения, не обозначенные на графе. В описании графа отображена разница входных и выходных данных каждой вершины для первой и последующих итераций.&lt;br /&gt;
# Ось Х – выполнение операций внутри каждой итерации, ось Y – итерации. Ось Z введена (возможно, несколько искусственно) для отражения параллельности вычисления зеленых вершин. Таким образом, каждая группа вершин одной итерации расположена в плоскости, параллельной OXZ. Возможные исправления: отобразить эти плоскости для каждой итерации (например, пунктиром) либо удалить ось Z. &lt;br /&gt;
[[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.8 все шаги имеют номер 1. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* Не заполнен раздел 2.4 описания. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 14:41, 16 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Tameeva.a</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=16090</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=16090"/>
		<updated>2016-11-07T22:35:36Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Каждая итерация алгоритма для матрицы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; заключается в последовательном выполнении следующих ярусов:&lt;br /&gt;
&lt;br /&gt;
# Вычисление  &amp;lt;math&amp;gt;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;
# Поворот матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; с параллельным вычислением элементов матрицы &amp;lt;math&amp;gt;a_{jl, kl}^{(i+1)}&amp;lt;/math&amp;gt;, (высота этой части яруса – 2 операции, ширина – &amp;lt;math&amp;gt;4(n-2)&amp;lt;/math&amp;gt;) и элементов &amp;lt;math&amp;gt;a_{jj,kk}^{(i+1)}&amp;lt;/math&amp;gt; (высота этой части яруса – 4 операции, ширина — 5).&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=16081</id>
		<title>Обсуждение участницы:Tameeva.a</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=16081"/>
		<updated>2016-11-07T20:55:21Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Замечания по тексту */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
* Отсутствуют заголовки пунктов 2.2-2.6, соответственно пункт 2.1 должен иметь нумерацию 2.4, а пункт 2.2 должен иметь нумерацию 2.7. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* Представленное на рис.1 не является графом алгоритма: по определению в нём не должно быть управляющих вершин, также не вполне понятны вершины с данными; непонятны также разноцветные дуги. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
** Граф на рис.1 является малопонятным - структура вычислений не показана и спрятана в макровершинах, зелёные макровершины почему-то имеют то один вход, то два, а то три - они каждый раз соответствуют разным вычислениям? И почему на рисунке 3 оси, хотя граф выглядит совершенно двумерным? Чему вообще соответствуют эти оси? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
# Граф упрощен до версии без управляющих вершин и входных и выходных данных.&lt;br /&gt;
# Дуги окрашены в цвет вершин, из которых выходят (при изображении графа руководствовались [https://algowiki-project.org/ru/Стандарт_визуализации_ГА стандартом визуализации ГА]: &amp;quot;Цвет любой дуги графа рекомендуется задавать в соответствии с цветом вершины операции, из которой выходит эта дуга.&amp;quot;)&lt;br /&gt;
# Добавлены рис. 2–4 с внутренней структурой макровершин.&lt;br /&gt;
# Различное количество входов имеют зеленые вершины различных типов (с вычислением &amp;lt;math&amp;gt;A_{jj, kk}&amp;lt;/math&amp;gt; и с вычислением &amp;lt;math&amp;gt;A_{jl,kl}&amp;lt;/math&amp;gt;). Также на второй и последующих итерациях используются только предыдущие вычисления, а на первой могут использоваться и входные значения, не обозначенные на графе. В описании графа отображена разница входных и выходных данных каждой вершины для первой и последующих итераций.&lt;br /&gt;
# Ось Х – выполнение операций внутри каждой итерации, ось Y – итерации. Ось Z введена (возможно, несколько искусственно) для отражения параллельности вычисления зеленых вершин. Таким образом, каждая группа вершин одной итерации расположена в плоскости, параллельной OXZ. Возможные исправления: отобразить эти плоскости для каждой итерации (например, пунктиром) либо удалить ось Z. &lt;br /&gt;
[[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.8 все шаги имеют номер 1. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 23:54, 7 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Tameeva.a</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=16071</id>
		<title>Обсуждение участницы:Tameeva.a</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Tameeva.a&amp;diff=16071"/>
		<updated>2016-11-07T17:40:20Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Отсутствующие части */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Akukhtinov/Метод Якоби для вычисления собственных значений симметричной матрицы]] ==&lt;br /&gt;
&lt;br /&gt;
=== Отсутствующие части ===&lt;br /&gt;
* Не указан вклад каждого из авторов статьи. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
* Отсутствуют заголовки пунктов 2.2-2.6, соответственно пункт 2.1 должен иметь нумерацию 2.4, а пункт 2.2 должен иметь нумерацию 2.7. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
**Исправлено. [[Участник:Tameeva.a|Tameeva.a]] ([[Обсуждение участника:Tameeva.a|обсуждение]]) 20:40, 7 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* Представленное на рис.1 не является графом алгоритма: по определению в нём не должно быть управляющих вершин, также не вполне понятны вершины с данными; непонятны также разноцветные дуги. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 11:21, 25 октября 2016 (MSK)&lt;br /&gt;
** Граф на рис.1 является малопонятным - структура вычислений не показана и спрятана в макровершинах, зелёные макровершины почему-то имеют то один вход, то два, а то три - они каждый раз соответствуют разным вычислениям? И почему на рисунке 3 оси, хотя граф выглядит совершенно двумерным? Чему вообще соответствуют эти оси? [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;br /&gt;
* В разделе 1.8 все шаги имеют номер 1. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 10:32, 1 ноября 2016 (MSK)&lt;/div&gt;</summary>
		<author><name>Tameeva.a</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=16070</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=16070"/>
		<updated>2016-11-07T17:38:13Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке 1. Отображение дано на макроуровне без входных и выходных данных, дублирующие друг друга дуги показаны как одна. Внутренняя структура каждой вершины на i-той итерации представлена рисунками 2–4.&lt;br /&gt;
&lt;br /&gt;
[[File:Jacobi.png|800px|thumb|center|Рисунок 1. Граф алгоритма без отображения входных и выходных данных. ]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumb&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;thumbinner&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=750px&amp;gt;&lt;br /&gt;
File:calculate_cs_block.png|Рисунок 2. Структура вершины &#039;&#039;&#039;&#039;&#039;Calculate c,s&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;gallery widths=500px heights=500px&amp;gt;&lt;br /&gt;
File:Akk_block.png|Рисунок 3. Структура вершины &amp;lt;math&amp;gt;A_{jj}, A_{kk}&amp;lt;/math&amp;gt; (вычисление  &amp;lt;math&amp;gt;a_{jj}, a_{kk}&amp;lt;/math&amp;gt;).&lt;br /&gt;
File:Ajl_block.png|Рисунок 4. Структура вершины &amp;lt;math&amp;gt;A_{jl}, A_{kl}&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;a_{jl},a_{kl},l\ne j,k&amp;lt;/math&amp;gt;). Количество входных и выходных значений, а также количество операций на каждом уровне указано слева.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
Для выполнения каждой итерации требуется последовательно выполнить следующие ярусы (для матрицы порядка &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;
# Вычислить  &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;
# Поворот матрицы &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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</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=15821</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=15821"/>
		<updated>2016-11-02T16:22:32Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке. Входные и выходные данные не отображены, дублирующие друг друга дуги даны как одна.[[File:Jacobi.png|600px|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;
# Вычислить  &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;
# Поворот матрицы &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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</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=15143</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=15143"/>
		<updated>2016-10-31T15:41:15Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке. Входные и выходные данные не отображены, дублирующие друг друга дуги даны как одна.[[File:Jacobi.png|600px|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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</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=15142</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=15142"/>
		<updated>2016-10-31T15:40:17Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
Описанный граф для четырех итераций представлен на рисунке. Входные и выходные данные не отображены, дублирующие друг друга дуги даны как одна.[[File:Jacobi.png|600px|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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</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=15141</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=15141"/>
		<updated>2016-10-31T15:39:55Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</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=15139</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=15139"/>
		<updated>2016-10-31T15:37:11Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]],  [[#Входные и выходные данные алгоритма|1.9]]). Вклад в разделы [[#Последовательная сложность алгоритма|1.6]], [[#Информационный граф|1.7]],  [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]] считаем равным.&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;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;
2. &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;
3. &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;
&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;
=ЧАСТЬ. Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&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;
Существует также [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>Tameeva.a</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=13995</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=13995"/>
		<updated>2016-10-26T13:25:35Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:Tameeva.a|А. Тамеева]] (разделы [[#Общее описание алгоритма|1.1]],[[#Математическое описание алгоритма|1.2]],[[#Вычислительное ядро алгоритма|1.3]],[[#Макроструктура алгоритма|1.4]],[[#Информационный граф|1.7]]), [[Участник:AKukhtinov|А. Кухтинов]] (разделы [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Входные и выходные данные алгоритма|1.9]], [[#Свойства алгоритма|1.10]], [[#Существующие реализации алгоритма|2.7]]).&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;
==Возможные способы и особенности параллельной реализации алгоритма==&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;
Существует также [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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11665</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11665"/>
		<updated>2016-10-15T20:09:38Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Информационный граф */&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11594</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11594"/>
		<updated>2016-10-15T19:57:39Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Информационный граф */&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11591</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11591"/>
		<updated>2016-10-15T19:57:13Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11546</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11546"/>
		<updated>2016-10-15T19:48:33Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Метод Якоби вычисления собственных значений симметричной матрицы&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник: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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11405</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11405"/>
		<updated>2016-10-15T19:25:10Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
(&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;
Аргументы функции:&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;
** Последующие — результаты вычислений вершины четвертой группы a^{i+1}_{jk}.&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;
&#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;
Из существующихалгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным. Его преимущество заключается в том, что  он не предполагает первоначального приведения матрицы к трехдиагональной форме. Также метод до сих пор используется на практике для вычисления малых собственных чисел и отвечающих им собственных векторов, так как он делает это с гораздо большей точностью, чем другие методы&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11397</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=11397"/>
		<updated>2016-10-15T19:24:10Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Информационный граф */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
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;
(&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;
Аргументы функции:&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;
** Последующие — результаты вычислений вершины четвертой группы a^{i+1}_{jk}.&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;
&#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;
Из существующихалгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным. Его преимущество заключается в том, что  он не предполагает первоначального приведения матрицы к трехдиагональной форме. Также метод до сих пор используется на практике для вычисления малых собственных чисел и отвечающих им собственных векторов, так как он делает это с гораздо большей точностью, чем другие методы&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10986</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10986"/>
		<updated>2016-10-15T17:59:46Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Входные и выходные данные алгоритма */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
&#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;
Из существующихалгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным. Его преимущество заключается в том, что  он не предполагает первоначального приведения матрицы к трехдиагональной форме. Также метод до сих пор используется на практике для вычисления малых собственных чисел и отвечающих им собственных векторов, так как он делает это с гораздо большей точностью, чем другие методы&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10984</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10984"/>
		<updated>2016-10-15T17:59:26Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Входные и выходные данные алгоритма */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; &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;
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;
Из существующихалгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным. Его преимущество заключается в том, что  он не предполагает первоначального приведения матрицы к трехдиагональной форме. Также метод до сих пор используется на практике для вычисления малых собственных чисел и отвечающих им собственных векторов, так как он делает это с гораздо большей точностью, чем другие методы&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10951</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10951"/>
		<updated>2016-10-15T17:53:31Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Свойства алгоритма */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
&#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;
Из существующихалгоритмов вычисления собственных значений симметричной матрицы метод Якоби является самым медленным. Его преимущество заключается в том, что  он не предполагает первоначального приведения матрицы к трехдиагональной форме. Также метод до сих пор используется на практике для вычисления малых собственных чисел и отвечающих им собственных векторов, так как он делает это с гораздо большей точностью, чем другие методы&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10874</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=10874"/>
		<updated>2016-10-15T17:40:30Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Существующие реализации алгоритма */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
&#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;
Существует также [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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8972</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8972"/>
		<updated>2016-10-15T10:12:14Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Последовательная сложность алгоритма */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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;
&#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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8882</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8882"/>
		<updated>2016-10-15T09:50:28Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Последовательная сложность алгоритма */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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+8&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;
&#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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8877</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8877"/>
		<updated>2016-10-15T09:49:28Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Математическое описание алгоритмаДж. Деммель «Вычислительная линейная алгебра» (стр. 244-245) */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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+8&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#039;&#039;кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8870</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8870"/>
		<updated>2016-10-15T09:46:46Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Математическое описание алгоритмаДж. Деммель «Вычислительная линейная алгебра» (стр. 244-245) */&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;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&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+8&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#039;&#039;кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8862</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=8862"/>
		<updated>2016-10-15T09:44:38Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Последовательная сложность алгоритма */&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;4\,n+8&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#039;&#039;кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7074</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=7074"/>
		<updated>2016-10-14T07:14:13Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Свойства алгоритма */&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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6787</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6787"/>
		<updated>2016-10-13T19:12:06Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Вычислительное ядро алгоритма */&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;
Библиотека [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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6775</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=6775"/>
		<updated>2016-10-13T19:05:59Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Вычислительное ядро алгоритма */&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;
Вычислительное ядро алгоритма составляют:&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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
&lt;br /&gt;
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;
: &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;
Библиотека [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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5961</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5961"/>
		<updated>2016-10-12T19:01:19Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: /* Общее описание алгоритма */&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_{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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&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;
Библиотека [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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5956</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5956"/>
		<updated>2016-10-12T18:59:13Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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_{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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&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;
Библиотека [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>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5942</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5942"/>
		<updated>2016-10-12T18:42:55Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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_{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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом&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;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5896</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5896"/>
		<updated>2016-10-12T17:28:53Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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_{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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
 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;
Таким образом, алгоритм можно описать так:&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;
&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;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{3\,n(n-1)}{2}&amp;lt;/math&amp;gt;  делений,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{5\,n(n-1)}{2}&amp;lt;/math&amp;gt;  сложений (вычитаний),&lt;br /&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5894</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5894"/>
		<updated>2016-10-12T17:26:09Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &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;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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_{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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
 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;
Таким образом, алгоритм можно описать так:&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;
&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;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{3\,n(n-1)}{2}&amp;lt;/math&amp;gt;  делений,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{5\,n(n-1)}{2}&amp;lt;/math&amp;gt;  сложений (вычитаний),&lt;br /&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5887</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5887"/>
		<updated>2016-10-12T17:08:18Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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_{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;J&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_{jl}^{(i+1)} = a_{lj}^{(i+1)} = c \, a_{jl}^{(i)}  -  s \, a_{kl}^{(i)}, l \ne j,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_{kl}^{(i+1)} = a_{lk}^{(i+1)} = s \, a_{jl}^{(i)}  + c \, a_{kl}^{(i)},  l \ne j,k,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
каждое из которых повторяется по  &amp;lt;math&amp;gt;(n-2)&amp;lt;/math&amp;gt;  раза.&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Макроструктуру алгоритма можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
 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;
Таким образом, алгоритм можно описать так:&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;
&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;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{3\,n(n-1)}{2}&amp;lt;/math&amp;gt;  делений,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\frac{5\,n(n-1)}{2}&amp;lt;/math&amp;gt;  сложений (вычитаний),&lt;br /&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;
Таким образом, при классификации по последовательной сложности метод Якоби вычисления собственных значений симметричной матрицы относится к алгоритмам с &#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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5877</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5877"/>
		<updated>2016-10-12T16:19:30Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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 = \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;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5876</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5876"/>
		<updated>2016-10-12T16:17:25Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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 = \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;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5875</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5875"/>
		<updated>2016-10-12T16:16:36Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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 = \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; — собственные значения подматрицы \begin{bmatrix}a^{(i)}_{jj} &amp;amp; a^{(i)}_{jk} \\ a^{(i)}_{kj} &amp;amp; a^{(i)}_{kk}\end{bmatrix}. &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;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5840</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5840"/>
		<updated>2016-10-12T15:36:55Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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 = \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; — собственные значения подматрицы. &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;
== Макроструктура алгоритма ==&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5837</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5837"/>
		<updated>2016-10-12T15:34:55Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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;
&amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;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}&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 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;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
J_i = \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; — собственные значения подматрицы. &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;
== Макроструктура алгоритма ==&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5836</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5836"/>
		<updated>2016-10-12T15:34:31Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&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;
&amp;lt;math&amp;gt;\lambda_1&amp;lt;/math&amp;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}&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; 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 = \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; — собственные значения подматрицы. &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;
== Макроструктура алгоритма ==&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; плотная матрица &amp;lt;math&amp;gt;A=\{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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5777</id>
		<title>Участница:Tameeva.a/Метод Якоби вычисления собственных значений симметричной матрицы</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%D1%86%D0%B0:Tameeva.a/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%AF%D0%BA%D0%BE%D0%B1%D0%B8_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9_%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B&amp;diff=5777"/>
		<updated>2016-10-12T14:11:09Z</updated>

		<summary type="html">&lt;p&gt;Tameeva.a: Новая страница: «=ЧАСТЬ. Свойства и структура алгоритмов= == Общее описание алгоритма ==  Метод Якоби вычисл…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ЧАСТЬ. Свойства и структура алгоритмов=&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод Якоби вычисления собственных значений симметричной матрицы — итерационный алгоритм, названный в честь предложившего его в 1846 году Карла Густава Якоба Якоби. Исторически старейший метод для решения проблемы собственных значений получил широкое применение только в 1950-х годах с появлением компьютеров. Преимуществом метода является более точное вычисление малых собственных значений по сравнению с конкурирующими алгоритмами.&lt;br /&gt;
&lt;br /&gt;
Суть алгоритма — приведение симметрической матрицы к диагональной с собственными значениями на диагонали путем вращения.&lt;br /&gt;
&lt;br /&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;, столбцы — приближенные собственные вектора.&lt;br /&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{align}&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}\\&lt;br /&gt;
J_i = \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;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;\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}&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;
&#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;
&lt;br /&gt;
&#039;&#039;&#039;Дополнительные ограничения:&#039;&#039;&#039;&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=\{\lambda_{ii}\}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt; — собственные значения матрицы &amp;lt;math&amp;gt;A&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;/div&gt;</summary>
		<author><name>Tameeva.a</name></author>
	</entry>
</feed>