<?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=Grinch96</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=Grinch96"/>
	<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/Grinch96"/>
	<updated>2026-10-22T21:58:21Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24682</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24682"/>
		<updated>2017-11-30T17:20:13Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
При увеличении количества процессов для задач разных (фиксированных) размерностей наблюдается общая закономерность: сначала время решения стремительно падает, потом не изменяется и далее начинает увеличиваться. Это связано с тем, что когда время работы программы падает, время пересылок много меньше времени работы процессов. При увеличении количества процессов увеличивается количество пересылок (и, следовательно, затраченное на них время) и в какой-то момент становится больше времени работы процессов.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24681</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24681"/>
		<updated>2017-11-30T17:19:14Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
При увеличении количества процессов для задач разных размерностей наблюдается общая закономерность: сначала время решения стремительно падает, потом не изменяется и далее начинает увеличиваться. Это связано с тем, что когда время работы программы падает, время пересылок много меньше времени работы процессов. При увеличении количества процессов увеличивается количество пересылок (и, следовательно, затраченное на них время) и в какой-то момент становится больше времени работы процессов.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24680</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24680"/>
		<updated>2017-11-30T17:18:54Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
При увеличении количества процессоров для задач разных размерностей наблюдается общая закономерность: сначала время решения стремительно падает, потом не изменяется и далее начинает увеличиваться. Это связано с тем, что когда время работы программы падает, время пересылок много меньше времени работы процессов. При увеличении количества процессов увеличивается количество пересылок (и, следовательно, затраченное на них время) и в какой-то момент становится больше времени работы процессов.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24679</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24679"/>
		<updated>2017-11-30T17:17:50Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale_1.jpg]]&lt;br /&gt;
&lt;br /&gt;
При увеличении количества процессоров для задач разных размерностей наблюдается общая закономерность: сначала время решения стремительно падает, потом не изменяется и далее начинает увеличиваться. Это связано с тем, что когда время работы программы падает, время пересылок много меньше времени работы процессов. При увеличении количества процессоров увеличивается количество пересылок (и, следовательно, затраченное на них время) и в какой-то момент становится больше времени работы процесса.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24678</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24678"/>
		<updated>2017-11-30T17:04:25Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale_1.jpg]]&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Scale_1.jpg&amp;diff=24677</id>
		<title>Файл:Scale 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Scale_1.jpg&amp;diff=24677"/>
		<updated>2017-11-30T17:04:01Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24676</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24676"/>
		<updated>2017-11-30T17:02:48Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24671</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24671"/>
		<updated>2017-11-30T16:11:10Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&lt;br /&gt;
&lt;br /&gt;
Сильная масштабируемость на графике наблюдается в тех случаях, когда время пересылок много меньше времени работы процесса. Когда время, затраченное на пересылки, эквивалентно времени работы процесса, на графике мы можем наблюдать слабую масштабируемость. Если же время, затраченное на пересылки, начинает превышать время работы процессов, смысл от параллельности теряется, так как при увеличении числа процессов увеличивается время работы алгоритма.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24670</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24670"/>
		<updated>2017-11-30T16:10:29Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&lt;br /&gt;
&lt;br /&gt;
Сильная масштабируемость на графике наблюдается в тех случаях, когда время пересылок много меньше времени работы процесса. Когда время, затраченное на пересылки, эквивалентно времени работы процесса, на графике мы можем наблюдать слабую масштабируемость. Если же время, затраченное на пересылки, начинает превышать время работы процессов, смысл от параллельности теряется, так как при увеличении числа процессов увеличивается время подсчета.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24669</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24669"/>
		<updated>2017-11-30T16:09:20Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма (t) в зависимости от количества процессов (p) и размерности задачи (d):&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&lt;br /&gt;
&lt;br /&gt;
Сильная масштабируемость на графике наблюдается в тех случаях, когда время пересылок много меньше времени работы процесса. Когда время, затраченное на пересылки, эквивалентно времени работы процесса, на графике мы можем наблюдать слабую масштабируемость. Если же время пересылок начинает превышать время работы процессоров, смысл от параллельности теряется, так как при увеличении числа процессов увеличивается время подсчета.&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24664</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24664"/>
		<updated>2017-11-30T15:58:44Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;/math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от количества процессов и размерности задачи:&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24663</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24663"/>
		<updated>2017-11-30T15:58:23Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров &amp;lt;math&amp;gt;2^k&amp;lt;/math&amp;gt;, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы &amp;lt;math&amp;gt;n^p&amp;lt;\math&amp;gt;, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от количества процессов и размерности задачи:&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24662</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24662"/>
		<updated>2017-11-30T15:49:05Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров 2^k, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы n^p, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от количества процессов и размерности задачи:&lt;br /&gt;
&lt;br /&gt;
[[File:Scale.jpg]]&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Scale.jpg&amp;diff=24658</id>
		<title>Файл:Scale.jpg</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Scale.jpg&amp;diff=24658"/>
		<updated>2017-11-30T15:48:00Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24655</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24655"/>
		<updated>2017-11-30T15:41:54Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot; Суперкомпьютерного комплекса Московского университета.&lt;br /&gt;
&lt;br /&gt;
Набор и границы значений изменяемых параметров запуска реализации алгоритма:&lt;br /&gt;
&lt;br /&gt;
число процессоров 2^k, где k пробегает от 0 до 7;&lt;br /&gt;
&lt;br /&gt;
размер матрицы n^p, где p пробегает от 8 до 12.&lt;br /&gt;
&lt;br /&gt;
На следующем рисунке приведен график времени работы алгоритма в зависимости от количества процессов и размерности задачи:&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://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24448</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24448"/>
		<updated>2017-11-29T12:07:08Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch graph 2.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует масса реализаций метода Грама-Шмидта без реортогонализации, о которых говорится, например, [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24447</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24447"/>
		<updated>2017-11-29T12:03:11Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
Если объединить вершины N и div, Sc и F (вершины будут означать суперпозиции соответствующих операций), то получится следующий, чуть более простой для понимания, граф:&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует масса реализаций метода Грама-Шмидта без реортогонализации, о которых говорится, например, [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24295</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24295"/>
		<updated>2017-11-26T21:07:58Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует масса реализаций метода Грама-Шмидта без реортогонализации, о которых говорится, например, [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24291</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24291"/>
		<updated>2017-11-26T21:02:59Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует масса реализаций метода Грама-Шмидта без реортогонализации, о которых говорится, например, [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации пока.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24285</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24285"/>
		<updated>2017-11-26T17:51:08Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Существует масса реализаций метода Грама-Шмидта без реортогонализации, о которых говорится, например, [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта здесь]. Про реализации с реортогонализацией информации пока нет.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24283</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24283"/>
		<updated>2017-11-26T17:42:18Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: невырожденная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: верхняя треугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&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} + n^2&amp;lt;/math&amp;gt;  (в силу треугольности матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; достаточно хранить только ее ненулевые элементы).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24282</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24282"/>
		<updated>2017-11-26T17:33:15Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; \frac{n}{k} &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24281</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24281"/>
		<updated>2017-11-26T17:32:39Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; n/k &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24280</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24280"/>
		<updated>2017-11-26T17:32:05Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; n/k &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24279</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24279"/>
		<updated>2017-11-26T17:30:15Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального предыдущим. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; n/k &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24278</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24278"/>
		<updated>2017-11-26T17:29:05Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального исходному. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; n/k &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frac{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24277</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24277"/>
		<updated>2017-11-26T17:28:44Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального исходному. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; n/k &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt;, и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O( \frak{n^3}{k} ) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24276</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24276"/>
		<updated>2017-11-26T17:27:47Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В последовательной версии алгоритма двумя самыми трудоемкими операциями являются подсчет скалярных произведений и вычисление вектора, ортогонального исходному. Мы хотим добиться, чтобы каждый процессор считал &amp;quot;кусок&amp;quot; этих операций, однако также для ускорения работы программы нужно минимизировать число пересылок между процессорами. Пусть &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; - количество процессоров. Предлагается разбить исходную матрицу &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; блоков по &amp;lt;math&amp;gt; n/k &amp;lt;/math&amp;gt; столбцов в каждом (&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - размерность задачи), тогда каждый процессор будет решать задачу на &amp;quot;своем подпространстве&amp;quot;. Таким образом мы добьемся количества пересылок порядка &amp;lt;math&amp;gt; O(kn) &amp;lt;/math&amp;gt; и параллельная сложность алгоритма составит &amp;lt;math&amp;gt; O(\frak{n^3}{k}) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24274</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24274"/>
		<updated>2017-11-26T17:04:30Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \; i = 1 \ldots n &amp;lt;/math&amp;gt; — столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; — операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; — операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; — операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; — операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; — операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \; i = 1 \ldots n, \; j = 1 \ldots n  &amp;lt;/math&amp;gt; — элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24273</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24273"/>
		<updated>2017-11-26T17:03:28Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i, \quad i = 1 \ldots n &amp;lt;/math&amp;gt; -- столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;; подаются на вход программе.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; -- операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; -- операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; -- операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; -- операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; -- операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i, \quad i = 1 \ldots n, \quad j = 1 \ldots n  &amp;lt;/math&amp;gt; -- элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно; выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24272</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24272"/>
		<updated>2017-11-26T17:01:08Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
Опишем вершины информационного графа.&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; a_i &amp;lt;/math&amp;gt; -- столбцы исходной матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;, подаются на вход алгоритму.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; -- операция взятия нормы вектора.&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; div &amp;lt;/math&amp;gt; -- операция деления вектора на число.&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; Sc &amp;lt;/math&amp;gt; -- операция взятия скалярного произведения двух векторов.&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; F &amp;lt;/math&amp;gt; -- операция вычитания из вектора произведение числа на вектор.&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; + &amp;lt;/math&amp;gt; -- операция суммирования двух чисел.&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ij} &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; q_i &amp;lt;/math&amp;gt; -- элементы матрицы &amp;lt;math&amp;gt; R &amp;lt;/math&amp;gt; и столбцы матрицы &amp;lt;math&amp;gt; Q &amp;lt;/math&amp;gt; соответственно, выходные данные программы.&lt;br /&gt;
&lt;br /&gt;
Информационный граф построен для матрицы размерности &amp;lt;math&amp;gt; 3 &amp;lt;/math&amp;gt; при выполнении реортогонализации для третьего вектора. &lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24271</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24271"/>
		<updated>2017-11-26T16:42:42Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[File:Grinch-graph.PNG]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24270</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24270"/>
		<updated>2017-11-26T16:39:43Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[file:grinch-graph.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24269</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24269"/>
		<updated>2017-11-26T16:38:53Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[file:graph.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24268</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24268"/>
		<updated>2017-11-26T16:37:48Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:инф_граф1.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24238</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24238"/>
		<updated>2017-11-26T10:51:57Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;n&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
* &amp;lt;math&amp;gt;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24227</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24227"/>
		<updated>2017-11-25T19:45:03Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
Если реортогонализация работает на каждом шаге (чего никогда не случается, однако предположим худший случай), то количество всех операций удвоится. Таким образом, умножения и сложения (вычитания) составляют основную часть алгоритма. &lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, процесс ортогонализации Грама-Шмидта с реортогонализацией относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24226</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24226"/>
		<updated>2017-11-25T19:41:22Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n-2)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24225</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24225"/>
		<updated>2017-11-25T19:40:28Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для факторизации матрицы порядка n процессом Грама-Шмидта в последовательном варианте без реортогонализации требуется: &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;(n-1)(n^2+2n-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n^2+2n^2-2n)&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24210</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24210"/>
		<updated>2017-11-25T18:32:39Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{m} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24209</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24209"/>
		<updated>2017-11-25T18:31:53Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad i = 1, \ldots , j - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24208</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24208"/>
		<updated>2017-11-25T18:11:07Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{j}^{T} a_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{i} = a_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{i}||_{2}/||p_{i}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{j}^{T} p_{i},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{i} = p_{i} - \sum_{j=1}^{i-1} q_{j} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{ii} = ||p_{i}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{i} = p_{i} / r_{ii} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24207</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24207"/>
		<updated>2017-11-25T18:05:45Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{j=1}^{i-1} q_{i} r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{j=1}^{i-1} q_{i} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24204</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24204"/>
		<updated>2017-11-25T17:55:08Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24203</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24203"/>
		<updated>2017-11-25T17:48:43Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь (как и везде) под второй нормой подразумевается:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; ||x||_2 = \sqrt{x_1^2 + x_2^{2} + \ldots + x_n^2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24202</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24202"/>
		<updated>2017-11-25T17:45:53Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||_2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24201</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24201"/>
		<updated>2017-11-25T17:44:27Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24200</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24200"/>
		<updated>2017-11-25T17:43:53Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij}^{0}, \quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r_{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24199</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24199"/>
		<updated>2017-11-25T17:42:04Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{j}||_{2}/||p_{j}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, выполнить 4, 5, 6. Иначе перейти сразу к 7:&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt; r_{ij}^{0} = q_{i}^{T} p_{j},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt; p_{j} = p_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij}^{0} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6. &amp;lt;math&amp;gt; r_{ij} = r_{ij}^{0} + r{ij},\quad j = 1, \ldots , i - 1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7. &amp;lt;math&amp;gt; r_{jj} = ||p_{j}||_{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8. &amp;lt;math&amp;gt; q_{j} = p_{j} / r_{jj} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24197</id>
		<title>Участник:Grinch96/QR-факторизация методом Грама-Шмидта с последующей реортогонализацией</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:Grinch96/QR-%D1%84%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B5%D0%B9_%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=24197"/>
		<updated>2017-11-25T17:31:59Z</updated>

		<summary type="html">&lt;p&gt;Grinch96: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = QR-факторизация&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)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;2\cdot n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор: [[Участник:Grinch96|Г. А. Балыбердин]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A = (a_1, ..., a_n)&amp;lt;/math&amp;gt; - вещественная матрица &amp;lt;math&amp;gt;n × n&amp;lt;/math&amp;gt;, определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;. Во многих приложениях требуется решать линейную систему &amp;lt;math&amp;gt;Ax=b&amp;lt;/math&amp;gt; c плохо-обусловленной матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. При решении данной задачи, чтобы не увеличивать число обусловленности матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, ее можно представить в виде &amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где матрица &amp;lt;math&amp;gt;Q \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; состоит из ортонормированных строк, а матрица &amp;lt;math&amp;gt; R \in \mathbb{R}^{n×n}&amp;lt;/math&amp;gt; является верхнетреугольной. В итоге мы получаем так называемую &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию. &lt;br /&gt;
&lt;br /&gt;
Чтобы построить &amp;lt;math&amp;gt;QR&amp;lt;/math&amp;gt;-факторизацию можно воспользоваться процессом [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта ортогонализации Грама-Шмидта]&amp;lt;ref&amp;gt; Тыртышников Е.Е. Методы численного анализа // М.: 2006. 83 с.&amp;lt;/ref&amp;gt;, однако в условиях машинной арифметики, матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; может получиться далекой от ортогональной.Чтобы этого избежать, на определенных итерациях нужно проводить процесс реортогонализации &amp;lt;ref&amp;gt;Luc Giraud, Julien Langou, Miroslav Rozložník, Jasper van den Eshof. Rounding error analysis of the classical Gram-Schmidt orthogonalization process // Springer-Verlag, 2005.&amp;lt;/ref&amp;gt;.&lt;br /&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;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;), определитель которой не равен &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляемые данные: верхнетреугольная матрица &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;r_{ij}&amp;lt;/math&amp;gt;), унитарная матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;q_{ij}&amp;lt;/math&amp;gt;); выполняется соотношение &amp;lt;math&amp;gt;QR=A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы процесса ортогонализации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}, \\&lt;br /&gt;
&amp;amp; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;q_{i}, \, a_{i} &amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; Q, \, A &amp;lt;/math&amp;gt; соответственно. &lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-ом шаге получаем &amp;lt;math&amp;gt;p_{m} \in \mathbb{R}^{n}&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} &amp;gt; k&amp;lt;/math&amp;gt;, запускается процесс реортогонализации. &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; произвольная и задает точность ортогональности матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. В посвященной методу реортогонализации статье &amp;lt;ref&amp;gt;Luc Giraud and Jilien Langou.  A robust criterion for the modified Gram–Schmidt algorithm with selective reorthogonalization // Society for Industrial and Applied Mathematic, 2003.&amp;lt;/ref&amp;gt; &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; рекомендуется брать равным &amp;lt;math&amp;gt;10&amp;lt;/math&amp;gt;, однако приводятся примеры алгоритмов, где &amp;lt;math&amp;gt;k=\sqrt{2}&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;k=\sqrt{5}&amp;lt;/math&amp;gt;. Мы исследуем &amp;lt;math&amp;gt;k=10&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть процесса реортогонализации - это процесс ортогонализации Грама-Шмидта, примененный повторно к вектору &amp;lt;math&amp;gt;p_{m}&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-оm шаге алгоритма. Более формально:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; \tilde{p}_{m} = p_{j} - \sum_{i=1}^{m-1} q_{i} (q_{i}^{T} p_{m}), \\&lt;br /&gt;
&amp;amp; q_{m} = \tilde{p}_{m} / ||\tilde{p}_{m}||_{2}, \\&lt;br /&gt;
&amp;amp; \tilde{r}_{mj} = q_{j}^{T} p_{m}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mj} = \tilde{r}_{mj} + r_{mj}^{0}, \quad j = 1, \ldots , m - 1, \\&lt;br /&gt;
&amp;amp; r_{mm} = ||\tilde{p}_{m}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;\tilde{q}_{i}&amp;lt;/math&amp;gt; столбцы матриц &amp;lt;math&amp;gt; \tilde{Q}_{m}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r_{mj}^{0}&amp;lt;/math&amp;gt; - элементы матрицы &amp;lt;math&amp;gt;R&amp;lt;/math&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;\dfrac{n(n+1)}{2}&amp;lt;/math&amp;gt; скалярных произведений векторов, включая вычисление длины вектора;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(n-1)n}{2}&amp;lt;/math&amp;gt; умножений векторов на число.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге реортогонализации добавляется &amp;lt;math&amp;gt; j-1 &amp;lt;/math&amp;gt; вычислений скалярных произведений векторов на число и столько же умножений вектора на число. Здесь реортогонализация производится на &amp;lt;math&amp;gt;j&amp;lt;/math&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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
&amp;amp; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} (q_{i}^{T} a_{j}), \\&lt;br /&gt;
&amp;amp; q_{j} = p_{j} / ||p_{j}||_{2}.&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
как если алгоритм реортогонализует повторно вектора, так и без реортогонализаций.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения процесса следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt; q_1 = \frac{a_1}{||a_1||}; &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее для всех &amp;lt;math&amp;gt; i = 2, n &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt; r_{ij} = q_{i}^{T} a_{j},\quad j = 1, \ldots , i - 1; &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt; p_{j} = a_{j} - \sum_{i=1}^{j-1} q_{i} r_{ij} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;||a_{m}||_{2}/||p_{m}||_{2} \le k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:]]&lt;br /&gt;
[[Категория:]]&lt;/div&gt;</summary>
		<author><name>Grinch96</name></author>
	</entry>
</feed>