<?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=Amelie</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=Amelie"/>
	<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/Amelie"/>
	<updated>2026-10-22T15:44:32Z</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22853</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22853"/>
		<updated>2017-09-14T07:04:31Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких современных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;:&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;  и &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;  соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22852</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22852"/>
		<updated>2017-09-14T06:59:46Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких современных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;:&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22851</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22851"/>
		<updated>2017-09-14T06:58:27Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких современных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;:&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22850</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22850"/>
		<updated>2017-09-14T06:57:07Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких современных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22849</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22849"/>
		<updated>2017-09-13T21:24:35Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22848</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22848"/>
		<updated>2017-09-13T21:23:29Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; — евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22847</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22847"/>
		<updated>2017-09-13T21:22:58Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; -- евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22846</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22846"/>
		<updated>2017-09-13T21:22:43Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; --- евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22845</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=22845"/>
		<updated>2017-09-13T21:22:07Z</updated>

		<summary type="html">&lt;p&gt;Amelie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт, используя процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений, отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=21345</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=21345"/>
		<updated>2016-12-19T09:33:14Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом — по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=21343</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=21343"/>
		<updated>2016-12-19T09:32:34Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA|Frolov}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=21072</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=21072"/>
		<updated>2016-12-16T16:56:24Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* По существу  (будет пополняться по мере вчитывания) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
* &amp;quot;Невозможно разобрать выражение (синтаксическая ошибка)&amp;quot; --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 15:41, 16 декабря 2016 (MSK)&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
        Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 1.8 Ресурс параллелизма алгоритма] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант|Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
*** Это, конечно, лестно, но тестирование-то у вас для какого варианта скалярных произведений? Это существенно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 11:41, 9 декабря 2016 (MSK)&lt;br /&gt;
        Тестирование проводилось для последовательной реализации вычисления скалярных произведений.&lt;br /&gt;
***** Тогда все описания должны быть для этого варианта, а то, что &amp;quot;можно сделать&amp;quot; - в возможности реализации, не более. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 15:34, 14 декабря 2016 (MSK)&lt;br /&gt;
        Исправлено.&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=21071</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=21071"/>
		<updated>2016-12-16T16:55:26Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — O(n) и O(1) соответственно);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте ЯПФ — O(n), по ширине - O(1));&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{kn}=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;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=21002</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=21002"/>
		<updated>2016-12-15T21:17:11Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
        Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 1.8 Ресурс параллелизма алгоритма] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант|Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
*** Это, конечно, лестно, но тестирование-то у вас для какого варианта скалярных произведений? Это существенно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 11:41, 9 декабря 2016 (MSK)&lt;br /&gt;
        Тестирование проводилось для последовательной реализации вычисления скалярных произведений.&lt;br /&gt;
***** Тогда все описания должны быть для этого варианта, а то, что &amp;quot;можно сделать&amp;quot; - в возможности реализации, не более. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 15:34, 14 декабря 2016 (MSK)&lt;br /&gt;
        Исправлено.&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20922</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20922"/>
		<updated>2016-12-14T16:29:04Z</updated>

		<summary type="html">&lt;p&gt;Amelie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
        Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 1.8 Ресурс параллелизма алгоритма] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант|Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
*** Это, конечно, лестно, но тестирование-то у вас для какого варианта скалярных произведений? Это существенно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 11:41, 9 декабря 2016 (MSK)&lt;br /&gt;
        Тестирование проводилось для последовательной реализации вычисления скалярных произведений.&lt;br /&gt;
***** Тогда все описания должны быть для этого варианта, а то, что &amp;quot;можно сделать&amp;quot; - в возможности реализации, не более. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 15:34, 14 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20317</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20317"/>
		<updated>2016-12-07T21:28:43Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* По существу  (будет пополняться по мере вчитывания) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 1.8 Ресурс параллелизма алгоритма] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант|Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20316</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20316"/>
		<updated>2016-12-07T21:27:20Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* По существу  (будет пополняться по мере вчитывания) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 1.8 Ресурс параллелизма алгоритма] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20315</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20315"/>
		<updated>2016-12-07T21:26:54Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* По существу  (будет пополняться по мере вчитывания) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 1.8 Ресурс параллелизма алгоритма] ] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20314</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20314"/>
		<updated>2016-12-07T21:26:24Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0 |1.8 Ресурс параллелизма алгоритма] ] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20313</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20313"/>
		<updated>2016-12-07T21:24:53Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* По существу  (будет пополняться по мере вчитывания) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [[1.8 Ресурс параллелизма алгоритма|https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0] ] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20311</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20311"/>
		<updated>2016-12-07T21:24:15Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* По существу  (будет пополняться по мере вчитывания) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [[ 1.8 Ресурс параллелизма алгоритма |https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0] ] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20309</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20309"/>
		<updated>2016-12-07T21:22:30Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте [1.8 Ресурс параллелизма алгоритма |https://algowiki-project.org/ru/%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0#.D0.A0.D0.B5.D1.81.D1.83.D1.80.D1.81_.D0.BF.D0.B0.D1.80.D0.B0.D0.BB.D0.BB.D0.B5.D0.BB.D0.B8.D0.B7.D0.BC.D0.B0_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D0.B0] мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20308</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20308"/>
		<updated>2016-12-07T21:21:05Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте 1.8 мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20307</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20307"/>
		<updated>2016-12-07T21:20:30Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант| скалярных произведений]] пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20306</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20306"/>
		<updated>2016-12-07T21:19:24Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20304</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20304"/>
		<updated>2016-12-07T21:03:41Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательно-параллельный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20303</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20303"/>
		<updated>2016-12-07T21:02:52Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте 1.3 мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательно-параллельный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20302</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=20302"/>
		<updated>2016-12-07T20:55:41Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
* А почему корни квадратные для ск. произведений? Можно ведь и логарифм. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:02, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
   Можно. В пункте 1.3 мы ссылаемся на Вашу подтвержденную статью [[Скалярное_произведение_векторов,_вещественная_версия,_последовательный_вариант]], и далее пользуемся готовым вариантом для достижения последовательного систематического изложения в статьях в вики-проекте (чтобы каждая статья не вводила заново способ вычисления общих блоков).&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20293</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=20293"/>
		<updated>2016-12-07T20:16:06Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Frolov&amp;diff=19068</id>
		<title>Обсуждение участника:Frolov</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Frolov&amp;diff=19068"/>
		<updated>2016-11-24T06:21:04Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статьи студентов к проверке по существу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статьи студентов к проверке по существу ==&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_2, Метод Якоби вычисления собственных значений симметричной&lt;br /&gt;
&amp;gt;&amp;gt; матрицы (5):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы_ЗП]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Akukhtinov/Метод_Якоби_для_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Алексей_Будюк/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участница:Tameeva.a/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_3, Метод Якоби вычисления сингулярных чисел и векторов (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:GrishinaAnna/Методя_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Давлетшина_Александра,_Зайцева_Александра/Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участники:_Ивкина_Е.,_Колганова_В./Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_7, Ортогонализация Грамма-Шмидта (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация_Грама-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:DVIN/Ортогонализация_Грамма-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участники:Павлов_Андрей,_Филимонов_Владимир/Ортогонализация_Грама_-_Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Valeriya_Shervarly/Ортогонализация_Грама-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_12, Нахождение собственных чисел квадратной матрицы методом QR&lt;br /&gt;
&amp;gt;&amp;gt; разложения (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(2)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Frolov&amp;diff=19067</id>
		<title>Обсуждение участника:Frolov</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Frolov&amp;diff=19067"/>
		<updated>2016-11-24T06:19:56Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статьи студентов к проверке по существу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статьи студентов к проверке по существу ==&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_2, Метод Якоби вычисления собственных значений симметричной&lt;br /&gt;
&amp;gt;&amp;gt; матрицы (5):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы_ЗП]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Akukhtinov/Метод_Якоби_для_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Алексей_Будюк/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участница:Tameeva.a/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_3, Метод Якоби вычисления сингулярных чисел и векторов (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:GrishinaAnna/Методя_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Давлетшина_Александра,_Зайцева_Александра/Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участники:_Ивкина_Е.,_Колганова_В./Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_7, Ортогонализация Грамма-Шмидта (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация Грама-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:DVIN/Ортогонализация_Грамма-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участники:Павлов_Андрей,_Филимонов_Владимир/Ортогонализация_Грама_-_Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Valeriya_Shervarly/Ортогонализация_Грама-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_12, Нахождение собственных чисел квадратной матрицы методом QR&lt;br /&gt;
&amp;gt;&amp;gt; разложения (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(2)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Frolov&amp;diff=19066</id>
		<title>Обсуждение участника:Frolov</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Frolov&amp;diff=19066"/>
		<updated>2016-11-24T06:18:49Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статьи студентов к проверке по существу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статьи студентов к проверке по существу ==&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_2, Метод Якоби вычисления собственных значений симметричной&lt;br /&gt;
&amp;gt;&amp;gt; матрицы (5):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы_ЗП]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Akukhtinov/Метод_Якоби_для_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Алексей_Будюк/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участница:Tameeva.a/Метод_Якоби_вычисления_собственных_значений_симметричной_матрицы]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_3, Метод Якоби вычисления сингулярных чисел и векторов (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:GrishinaAnna/Методя_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Давлетшина_Александра,_Зайцева_Александра/Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участники:_Ивкина_Е.,_Колганова_В./Метод_Якоби_вычисления_сингулярных_чисел_и_векторов]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_7, Ортогонализация Грамма-Шмидта (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:KibAndrey/Ортогонализация Грама-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:DVIN/Ортогонализация_Грамма-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участники:Павлов_Андрей,_Филимонов_Владимир/Ортогонализация_Грама_-_Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Участник:Valeriya_Shervarly/Ортогонализация_Грама-Шмидта]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; Алгоритм_12, Нахождение собственных чисел квадратной матрицы методом QR&lt;br /&gt;
&amp;gt;&amp;gt; разложения (4):&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(2)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt; [https://algowiki-project.org/ru/Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(4)]&lt;br /&gt;
&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18904</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18904"/>
		<updated>2016-11-22T02:45:51Z</updated>

		<summary type="html">&lt;p&gt;Amelie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18903</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18903"/>
		<updated>2016-11-22T02:42:56Z</updated>

		<summary type="html">&lt;p&gt;Amelie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|ASA}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18441</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18441"/>
		<updated>2016-11-19T06:24:04Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3, запуск проводился на очереди test со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=18399</id>
		<title>Обсуждение участника:KibAndrey</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:KibAndrey&amp;diff=18399"/>
		<updated>2016-11-18T21:20:56Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Статья Участник:KibAndrey/Ортогонализация_Грама-Шмидта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:KibAndrey/Ортогонализация_Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу  (будет пополняться по мере вчитывания) ===&lt;br /&gt;
&lt;br /&gt;
* Поправьте формулы там, где индексы &amp;quot;лезут в строку&amp;quot;, глаз спотыкается даже у тех, кто знает материал, а уж у новичков-то и подавно. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* Редкие слова лучше уж расшифровывать. Или писать их синонимами, понятными всем. Мудрёные слова не всегда показывают знания авторов, бывает, что за ними прячут бедность знаний того, что рядом. Естественно, они раздражают читателей. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)  &lt;br /&gt;
&lt;br /&gt;
    В замечании меется в виду ссылка по основным понятиям &amp;quot;ортогонализация&amp;quot;, &amp;quot;гильбертово пространство&amp;quot;, &amp;quot;интегральные уравнения&amp;quot; и т.д.? как можно их заменить синонимами?&lt;br /&gt;
*** Нет, мудрёные слова, обозначающие тех, кто рассчитывает страховые риски и т.п. Приведённые же Вами примеры - нормальные термины в математике. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 13:53, 8 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
        Спасибо, понятно, а то не могли понять, думали надо ссылки на определения...&lt;br /&gt;
&lt;br /&gt;
                Исправлено. &lt;br /&gt;
&lt;br /&gt;
** Как и нестандартные обозначения, например, длины в евклидовом пространстве. Зачем они? --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 16:56, 7 ноября 2016 (MSK)&lt;br /&gt;
     Мы подумали, что статья пишется для программистов, а не для математиков, а математически строгим и привычным должно быть только матесматическое описание, в то время как раздел &amp;quot;Схема реализации последовательного алгоритма&amp;quot; должен содержать максимально понятное описание для написание кода. Этим и руководствовались при выбре обозначения здесь. Вы считаете стоит исправить?&lt;br /&gt;
*** Думаю, стоит. Статья для всех, а математические обозначения более древние и потому более устоявшиеся. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:22, 10 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
&lt;br /&gt;
=== Замечания по тексту ===&lt;br /&gt;
* В разделе 1.4 должно быть не перечисление макроопераций, а нужно показать структуру алгоритма на макроуровне. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Неправильно поняли задание, смутило написанное в данном пункте в образцовой статье. Так, как сейчас, верно?&lt;br /&gt;
* Если в разделе 1.7 в информационном графе указываете входные и выходные вершины, лучше не помечать их In и Out, а указывать конкретные элементы данных. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 17:58, 1 ноября 2016 (MSK)&lt;br /&gt;
    Поправили.&lt;br /&gt;
* В разделе 2.4 сбилась нумерация рисунков. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 не приведены все параметры запуска теста - какой компилятор, с какими опциями использовался, какие версии библиотек, на каких узлах проводился запуск и т.д. [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;br /&gt;
&lt;br /&gt;
* В разделе 2.4 никак не объяснены множественные особенности графиков (особенно для реализации на MPI). [[Участник:ASA|Александр Сергеевич Антонов]] ([[Обсуждение участника:ASA|обсуждение]]) 15:54, 16 ноября 2016 (MSK) &lt;br /&gt;
&lt;br /&gt;
    Исправлено.&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18397</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18397"/>
		<updated>2016-11-18T21:19:16Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3. со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18395</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18395"/>
		<updated>2016-11-18T21:18:51Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3. со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18394</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18394"/>
		<updated>2016-11-18T21:18:29Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html | callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3. со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18391</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18391"/>
		<updated>2016-11-18T21:16:26Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3. со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18378</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18378"/>
		<updated>2016-11-18T21:06:50Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета]. Для компиляции параллельной программы использовалась версия компилятора intel/13.1.0 с ключом компиляции -O3, стандарт c++11, версия библиотеки Intel MPI impi/4.0.3. со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18363</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18363"/>
		<updated>2016-11-18T21:00:43Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] &lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3. со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
Компилятор intel/13.1.0, реализация MPI impi/4.0.3,&lt;br /&gt;
тоже c++11, с флагом -O3&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18358</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18358"/>
		<updated>2016-11-18T20:58:18Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
Код был скомпилирован gcc 4.3.2, стандарт c++11, с флагом -O3.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
Компилятор intel/13.1.0, реализация MPI impi/4.0.3,&lt;br /&gt;
тоже c++11, с флагом -O3&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18339</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18339"/>
		<updated>2016-11-18T20:53:47Z</updated>

		<summary type="html">&lt;p&gt;Amelie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18337</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18337"/>
		<updated>2016-11-18T20:53:29Z</updated>

		<summary type="html">&lt;p&gt;Amelie: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18327</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18327"/>
		<updated>2016-11-18T20:49:10Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере [http://hpc.cs.msu.ru/regatta| IBM Regatta суперкомпьютерного комплекса Московского университета] со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8;&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.008%;&lt;br /&gt;
*максимальная эффективность реализации 10.00%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18321</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18321"/>
		<updated>2016-11-18T20:47:27Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Возможные способы и особенности параллельной реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b).&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере IBM Regatta суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*Минимальная эффективность реализации 0.008%&lt;br /&gt;
*Максимальная эффективность реализации 10.00%&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18314</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18314"/>
		<updated>2016-11-18T20:43:34Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b)&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере IBM Regatta суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1;&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192.&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*минимальная эффективность реализации 0.20%;&lt;br /&gt;
*максимальная эффективность реализации 11.18%.&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*Минимальная эффективность реализации 0.008%&lt;br /&gt;
*Максимальная эффективность реализации 10.00%&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18311</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18311"/>
		<updated>2016-11-18T20:42:37Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b)&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере IBM Regatta суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*Минимальная эффективность реализации 0.20%&lt;br /&gt;
*Максимальная эффективность реализации 11.18%&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*Минимальная эффективность реализации 0.008%&lt;br /&gt;
*Максимальная эффективность реализации 10.00%&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18308</id>
		<title>Участник:KibAndrey/Ортогонализация Грама-Шмидта</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:KibAndrey/%D0%9E%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%D1%8F_%D0%93%D1%80%D0%B0%D0%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=18308"/>
		<updated>2016-11-18T20:39:37Z</updated>

		<summary type="html">&lt;p&gt;Amelie: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O\left(k^2n\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          =  &amp;lt;math&amp;gt;O(kn)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:KibAndrey| А.В.Кибанов]], [[Участник:Amelie| Т.З.Аджиева]].&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Процесс ортогонализации Грама–Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Математическая энциклопедия / Гл. ред.&lt;br /&gt;
И. М. Виноградов — М.: Советская энциклопедия — Т.4 Ок–Сло, 1984. — 215 с.&amp;lt;/ref&amp;gt; — алгоритм построения ортогональной системы ненулевых векторов по (данной) линейно независимой системе векторов из евклидова или эрмитова пространства V, при котором каждый вектор построенной системы линейно выражается через векторы исходной системы пространства V.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта может быть применен к любой, в том числе и линейно-зависимой системе элементов евклидова пространства. Если ортогонализуемая система линейно-зависима, то на некотором шаге (возможно несколько раз) мы получим нулевой элемент, после отбрасывания которого можно продолжить процесс ортогонализации&amp;lt;ref&amp;gt; А. Е. Умнов. Аналитическая геометрия и линейная алгебра — 3-е издание, исправленное и дополненное — М.: МФТИ — 2011 — 544 c.&amp;lt;/ref&amp;gt;, однако в данной статье этот случай мы не рассматриваем. &lt;br /&gt;
&lt;br /&gt;
Исторически это первый алгоритм, описывающий процесс ортогонализации. Традиционно его связывают с именами [https://en.wikipedia.org/wiki/J%C3%B8rgen_Pedersen_Gram Йоргена Педерсена Грама] и [https://en.wikipedia.org/wiki/Erhard_Schmidt Эрхарда Шмидта]. Йорган Педерсен Грам&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt; был датским актуарием (специалистом по страховой математике, на современном языке это профессия финансового аналитика), который в неявном виде представил суть процесса ортогонализации в 1883 году&amp;lt;ref&amp;gt;[http://gdz.sub.uni-goettingen.de/dms/load/img/?PID=GDZPPN002158604&amp;amp;physid=PHYS_0047 Gram J. P. Ueber die Entwickelung reeller Functionen in Reihen mittelst der Methode der kleinsten Quadrate.]  — &#039;&#039;Journal für die reine und angewandte Mathematik.&#039;&#039; — 1883. — Т. 94. — pp. 41–73.&amp;lt;/ref&amp;gt;. Нельзя не сказать о том, что метод ортогонализации в несколько ином, модифицированом виде, ранее использовал [https://en.wikipedia.org/wiki/Pierre-Simon_Laplace Пьер-Симон Лаплас] при нахождении массы Сатурна и Юпитера из систем нормальных уравнений и расчете распределения ошибок при этих вычислениях&amp;lt;ref&amp;gt; [https://books.google.ru/books?id=fjAVAAAAQAAJ&amp;amp;printsec=frontcover&amp;amp;hl=ru&amp;amp;source=gbs_ge_summary_r&amp;amp;cad=0#v=onepage&amp;amp;q&amp;amp;f=false Marquis de Laplace P. S. Théorie analytique des probabilités.] — V. Courcier, 1820.&amp;lt;/ref&amp;gt;. Ясно, что Й. Грам не знал о том, что Лаплас ранее использовал этот метод. Эрхард Шмидт&amp;lt;ref name=&amp;quot;multiple&amp;quot;&amp;gt;Meyer C. D. Matrix analysis and applied linear algebra. — Siam, 2000. — Т.2.&amp;lt;/ref&amp;gt;  был учеником великих математиков [https://en.wikipedia.org/wiki/Hermann_Schwarz Германа Шварца] и [https://en.wikipedia.org/wiki/David_Hilbert Давида Гильберта]. Алгоритм ортогонализации был опубликован Э. Шмидтом в 1907 году в его исследовании интегральных уравнений&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. —  Mathematische Annalen.  — 1908.  — V. 65. — №. 3. — pp. 370-399.&amp;lt;/ref&amp;gt;, которое в свою очередь дало основание для развития теории гильбертовых пространств. Шмидт использовал процесс ортогонализации применительно к геометрии гильбертова пространства решений интегральных уравнений отмечал, что процесс ортогонализации принципиально такой же, какой прежде использовал Й. Грам. В отечественной литературе иногда этот процесс называют &#039;&#039;ортогонализацией Сонина–Шмидта&#039;&#039;&amp;lt;ref&amp;gt;Краснов М.Л. Интегральные уравнения. Введение в теорию. — М.: Наука, 1975. — 302 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Марченко В.А. Введение в теорию обратных задач спектрального анализа. — Харьков: Акта, 2005. — 143 с.&amp;lt;/ref&amp;gt;. Это название связано с тем, что разработанный Сониным&amp;lt;ref&amp;gt;О некоторых неравенствах, относящихся к определенным интегралам. Записки Академии наук по физико-математическому отделению. Серия 8. Т. 6 № 6. — C. 1–53.&amp;lt;/ref&amp;gt; метод ортогонализации системы функций для частного случая по существу не отличается от метода ортогонализации системы функций, предложенного ранее Шмидтом&amp;lt;ref name=Shmidt&amp;gt;Erchard Shmidt. Mathematische Annalen Zur Theorie der linearen und nichtlinearen Integralgleichungen, 1. Teil: Entwicklung willkürlicher&lt;br /&gt;
Funktionen nach Systemen vorgeschriebener. — Mathematische Annalen, 63 (1907), pp. 433–476.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортоганализации Грама-Шмидта лежит в основе многих алгоритмов вычислительной математики.  &lt;br /&gt;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях науки, как анализ изображений&amp;lt;ref&amp;gt;Nussbaum S., Menz G. Object-based image analysis and treaty verification: new approaches in remote sensing-applied to nuclear facilities in Iran. — Springer Science &amp;amp; Business Media, 2008 — pp 75–81.&amp;lt;/ref&amp;gt;, цифровая обработка сигналов&amp;lt;ref&amp;gt;Gopi E. S. Algorithm collections for digital signal processing applications using matlab. — Springer Science &amp;amp; Business Media, 2007.&amp;lt;/ref&amp;gt;, нейронные сети&amp;lt;ref&amp;gt;[http://thirdworld.nl/application-of-sequential-learning-neural-networks-to-civil-engineering-modeling-problems Rajasekaran S., Suresh D., Pai G. A. V. Application of sequential learning neural networks to civil engineering modeling problems.] — &#039;&#039;Engineering with Computers.&#039;&#039; — 2002. — Т. 18. — №. 2. — pp. 138–147.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; евклидово пространство размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bходные данные:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; пространства &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_i}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формулы процесса ортогонализации:&#039;&#039;&#039;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\mathbf{b_{1}} &amp;amp; =\mathbf{a_{1}}, \\&lt;br /&gt;
\mathbf{b_{2}}&amp;amp; =\mathbf{a_{2}}-\mathbf{b_{1}} proj_{\mathbf{b_1}}\mathbf{a_{2}},\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{i}} &amp;amp; =\mathbf{ a_{i}}-\sum\limits_{j=1}^{i-1}\mathbf{b_{i}} proj_{\mathbf{b_j}}\mathbf{a_{i}}.\\&lt;br /&gt;
&amp;amp; ...\\&lt;br /&gt;
\mathbf{b_{k}} &amp;amp; =\mathbf{ a_{k}}-\sum\limits_{j=1}^{k-1}\mathbf{b_{k}} proj_{\mathbf{b_j}}\mathbf{a_{k}}.\\&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,k-1&amp;lt;/math&amp;gt; — это модуль проекции вектора &amp;lt;math&amp;gt;\mathbf{a_{j}}&amp;lt;/math&amp;gt; на ось, проходящую через вектор &amp;lt;math&amp;gt;\mathbf{b_j}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Формула для ее вычисления, полученная из определения скалярного произведения:&lt;br /&gt;
&amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}=\dfrac{(\mathbf{a_{i}},\mathbf{b_{j}})}{\mathbf{\left|\mathbf{b_j}\right|}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Произведение длин &amp;lt;math&amp;gt;\mathbf{|b_1|},\mathbf{|b_2|},\ldots ,\mathbf{|b_k|}&amp;lt;/math&amp;gt; равно объему параллелепипеда, построенного на векторах системы &amp;lt;math&amp;gt;\left\{\mathbf{a_i}\right\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;i=1,2,\ldots ,k&amp;lt;/math&amp;gt;, как на ребрах.&lt;br /&gt;
&lt;br /&gt;
Явное выражение векторов &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt;  через &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},...,\mathbf{a_k}&amp;lt;/math&amp;gt; дает  формула&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \mathbf{b_i}=&lt;br /&gt;
\begin{vmatrix}&lt;br /&gt;
(a_1,a_1) &amp;amp; \cdots &amp;amp; (a_1,a_i-1) &amp;amp;a_1 \\   &lt;br /&gt;
(a_{2},a_1) &amp;amp; \cdots &amp;amp; (a_2,a_i-1) &amp;amp;a_2 \\ &lt;br /&gt;
 \cdots &amp;amp; \cdots &amp;amp; \cdots&amp;amp; \cdots \\  &lt;br /&gt;
(a_{i},a_1) &amp;amp; \cdots &amp;amp; (a_i,a_i-1) &amp;amp;a_i  \\ &lt;br /&gt;
\end{vmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;.&lt;br /&gt;
(В правой части этого равенства определитель следует формально разложить по последнему столбцу). &lt;br /&gt;
&lt;br /&gt;
Иногда полученные векторы нормируются сразу после их нахождения и находится система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;. В этом случае в знаменателе при вычеслении проекции по формуле будет &amp;lt;math&amp;gt;|\mathbf{q_i}|=1&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=1,...,k-1&amp;lt;/math&amp;gt;, что существенно упрощает вычисления алгоритма.  В настоящей статье применяя процесс ортогонализации к системе линейно независимых векторов, мы так и будем поступать.&lt;br /&gt;
&lt;br /&gt;
Если в описанном алгоритме в формулах для вычисления векторов &amp;lt;math&amp;gt;\mathbf{b_i}\,&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,...,k&amp;lt;/math&amp;gt; процесса ортогонализации заменить &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{a_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;proj_{\mathbf{b_j}}\mathbf{b_{i}}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;j=1,...,i-1&amp;lt;/math&amp;gt;, алгоритм, полученный таким образом называется &#039;&#039;модифицированным алгоритмом Грама–Шмидта&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Чаще всего, процесс Грама–Шмидта приводит к значительному нарушению ортогональности. Что касается модифицированного процесса Грама–Шмидта, он проявляет себя достаточно неусточиво, хоть и чуть менее, чем классический процесс.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро алгоритма состоит из вычисления:&lt;br /&gt;
 &lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{k(k+1)}{2}&amp;lt;/math&amp;gt; [[Скалярное произведение векторов, вещественная версия, последовательный вариант| скалярных произведений]] векторов, &lt;br /&gt;
включая нахождения скалярных произведений одинаковых векторов дальнейшего нахождения их длин;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;\dfrac{(k-1)k}{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;
Теперь опишем макроструктуру процесса ортогонализации. На верхнем уровне она представляет из себя последовательное вычисление  &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_i},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. При &amp;lt;math&amp;gt;i=1&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{1}}= \frac{\mathbf{a_{1}}}{\left|\mathbf{a_1}\right|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i=2,...,k&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{b_{i}}=\mathbf{a_{i}}-\sum\limits_{k=1}^{i-1}(\mathbf{a_i},\mathbf{q_k})\mathbf{q_{k}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf{q_{i}}=\frac{\mathbf{b_{i}}}{\left|\mathbf{b_i}\right|}&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;k&amp;lt;/math&amp;gt; линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{a_1},\mathbf{a_2},\ldots,\mathbf{a_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\alpha_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{a_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b_1},\mathbf{b_2},...,\mathbf{b_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;\left(\beta_{ij}\right.&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt; — координаты вектора &amp;lt;math&amp;gt;\mathbf{b_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{b_1}=\mathbf{a_1}&amp;lt;/math&amp;gt;, либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{q_1},\mathbf{q_2},\ldots,\mathbf{q_k}&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j=1,2, \ldots,n&amp;lt;/math&amp;gt;  —  координаты вектора &amp;lt;math&amp;gt;\mathbf{q_i}&amp;lt;/math&amp;gt;, для  &amp;lt;math&amp;gt;\left.i=1,2, \ldots,k\right)&amp;lt;/math&amp;gt;, причем &amp;lt;math&amp;gt;\mathbf{q_1}=\frac{\mathbf{b_i}}{|\mathbf{b_i}|}&amp;lt;/math&amp;gt;, для &amp;lt;math&amp;gt;i=1,2, \ldots,k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Последовательность исполнения метода&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;|\mathbf{a_1}|=\sqrt{\alpha_{11}^2+\alpha_{12}^2+\ldots+\alpha_{1n}^2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\gamma_{1j}= \frac{\alpha_{1j}}{|\mathbf{a_1}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. При &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;2&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;:&lt;br /&gt;
 &lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
     &lt;br /&gt;
:::::&amp;lt;math&amp;gt;\beta_{ij}=\alpha_{ij}-\sum\limits_{k=1}^{j-1}\left(\sum\limits_{m=1}^n \alpha_{im}\gamma_{km}\right)\gamma_{kj} &amp;lt;/math&amp;gt;&lt;br /&gt;
::: &amp;lt;math&amp;gt;|\mathbf{b_i}|=\sqrt{\beta_{i1}^2+\beta_{i2}^2+\ldots+\beta_{in}^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:::при &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;:&lt;br /&gt;
::::::&amp;lt;math&amp;gt;\gamma_{ij}= \frac{\beta_{ij}}{|\mathbf{b_{i}}|}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; линейно независимых векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; в последовательном варианте с помощью классического метода ортогонализации Грама–Шмидта потребуется:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; сложений,&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{k(k-1)(n-1)}{2}&amp;lt;/math&amp;gt; вычитаний,&lt;br /&gt;
* &amp;lt;math&amp;gt;k^2 n&amp;lt;/math&amp;gt; умножений,&lt;br /&gt;
* &amp;lt;math&amp;gt;k n&amp;lt;/math&amp;gt; делений.&lt;br /&gt;
&lt;br /&gt;
Умножения, сложения и вычитания составляют &#039;&#039;основную часть алгоритма&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, метода ортогонализации Грама–Шмидта &#039;&#039;с кубической сложностью&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
Представим  [[глоссарий#Граф алгоритма|граф алгоритма]]&amp;lt;ref&amp;gt;Воеводин В.В.  Математические основы параллельных вычислений. —  М.: Изд. Моск. ун-та, 1991. — 345 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. — СПб.: БХВ - Петербург, 2002. — 608 с.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Фролов А.В.. Принципы построения и описание языка Сигма. Препринт ОВМ АН N 236. М.: ОВМ АН СССР, 1989.&amp;lt;/ref&amp;gt; с помощью текстового описания, а также с помощью изображения. &lt;br /&gt;
&lt;br /&gt;
Все вершины графа можно разбить на пять групп, каждой из которых соответствует вид исполняемой операции. Каждая вершина расположена в точках с целочисленными координатами, в пространствах с числом измерений от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;3&amp;lt;/math&amp;gt;. Дадим описание каждой из групп.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения вектора на себя. На графе они располагаются в одномерной области. &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1p}\}, p = 1..n&amp;lt;/math&amp;gt;;&lt;br /&gt;
* при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;\{i-1,1,p\}, p = 1..n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат этих операций является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа — вершины, которым соответствует операция SQRT извлечения квадратного корня. Они расположены в одномерной области, &amp;lt;math&amp;gt;i &amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значением аргумента для этих функций является результат выполнения функции в вершине первой группы, с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третья&#039;&#039;&#039; группа — вершины, которым соответствует операция деления. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* делимое:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* делитель -  результат выполнения функции в вершине второй группы с координатой &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является выходным данным алгоритма &amp;lt;math&amp;gt;q_{ip}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четвертая&#039;&#039;&#039; группа — вершины, которым соответствует операция скалярного умножения векторов &amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}&amp;lt;/math&amp;gt;. Располагаются в двумерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;\{a_{1+j,p}\},p = 1..n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;\{i,p\}, p = 1..n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пятая&#039;&#039;&#039; группа — вершины которые соответствуют операции &amp;lt;math&amp;gt;a - b c&amp;lt;/math&amp;gt;. Располагаются в трехмерной области, &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;k-i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; изменяется от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значениями аргументов для этих функций являются:&lt;br /&gt;
* &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;:&lt;br /&gt;
** при &amp;lt;math&amp;gt;i = 1&amp;lt;/math&amp;gt; — входные данные &amp;lt;math&amp;gt;a_{1+j,p}&amp;lt;/math&amp;gt;;&lt;br /&gt;
** при &amp;lt;math&amp;gt;i &amp;gt; 1&amp;lt;/math&amp;gt; — результат выполнения функции в вершине пятой группы с координатами &amp;lt;math&amp;gt;i-1,j+1,p&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; —  результат выполнения функции в вершине четвертой группы, с координатами &amp;lt;math&amp;gt;i,j&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — результат выполнения функции в вершине третьей группы с координатой &amp;lt;math&amp;gt;i,p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат является промежуточным данным алгоритма.&lt;br /&gt;
&lt;br /&gt;
Описанный граф для случая &amp;lt;math&amp;gt;k = 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;n = 3&amp;lt;/math&amp;gt; изображен на рисунке. Каждая группа вершин отличается цветом и буквенным обозначением. &amp;quot;S&amp;quot; — первая группа, &amp;quot;SQ&amp;quot; — вторая группа, &amp;quot;Div&amp;quot; — третья группа, &amp;quot;Dot&amp;quot; — четвертая группа, &amp;quot;f&amp;quot; — пятая группа. Квадратные метки синего и розового цветов обозначают передачу входных и выходных данных соответственно. &lt;br /&gt;
[[File:GSParallelDiagram.png|thumb|center|1000px|Рисунок 1. Граф алгоритма с отображением входных и выходных данных]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Для построения ортонормированного базиса методом Грама–Шмидта необходимо выполнить следующие ярусы операций:&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления скалярных произведений векторов на самих себя (по одной операций на каждом, сложность операции по высоте и по ширине [[глоссарий#Ярусно-параллельная форма графа алгоритма|ЯПФ]] — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов вычисления квадратного корня (по одной операции на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; ярусов деления (по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций на каждом);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус вычисления скалярных произведений пары векторов (от &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)&amp;lt;/math&amp;gt; операций на каждом,сложность операции по высоте и по ширине ЯПФ — корень квадратный);&lt;br /&gt;
*&amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; ярус умножения/вычитания чисел (от &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;(k-1)n&amp;lt;/math&amp;gt; операций на каждом).&lt;br /&gt;
В этом случае сложность алгоритма при классификации по высоте ЯПФ  — &amp;lt;math&amp;gt;O(k\sqrt{n})&amp;lt;/math&amp;gt;, при классификации по ширине ЯПФ — &amp;lt;math&amp;gt;O(kn)&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;\alpha_{ij}&amp;lt;/math&amp;gt;, &lt;br /&gt;
где &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt;1,\ldots,k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; принимает значения &amp;lt;math&amp;gt; 1,\ldots,n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Здесь &amp;lt;math&amp;gt;k\leqslant n&amp;lt;/math&amp;gt;. По строкам этой матрицы записаны &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; &lt;br /&gt;
линейно-независимых векторов некоторого пространства размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; с элементами &amp;lt;math&amp;gt;\gamma_{ij}&amp;lt;/math&amp;gt;. Строки этой матрицы также задают &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; векторов единичной длины размерности &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, причем всякое скалярное произведение двух различных векторов этой системы равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;kn&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Замечание: Алгоритм может работать с вырожденной матрицей, он выдаёт нулевую строку на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, &lt;br /&gt;
если строка &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; является линейной комбинацией предыдущих строк. &lt;br /&gt;
В этом случае для корректного продолжения работы алгоритма необходима &lt;br /&gt;
дополнительная проверка на равенство строки нулю и пропуск соответствующих строк. &lt;br /&gt;
Количество построенных векторов будет равняться размерности пространства, порождаемого строками матрицы.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Отношение последовательной и параллельной сложности алгоритма в случае неограниченных ресурсов равно &amp;lt;math&amp;gt;\dfrac{k^2n}{k\sqrt{n}}=k\sqrt{n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Вычислительная мощность алгоритма линейная.&lt;br /&gt;
&lt;br /&gt;
Алгоритм почти полностью детерминирован  — единственность результата выполнения гарантирована, однако возможно накопление ошибок округления.&lt;br /&gt;
&lt;br /&gt;
Алгоритм является численно неустойчивым  — ошибки округления могут привести к неортогональности полученных векторов.&lt;br /&gt;
&lt;br /&gt;
Большинство дуг информационного графа являются локальными. Исключение составляют дуги исходящие из операций деления и извлечения корня — для первой группы количество дуг пропорционально квадрату количества векторов, а для второй — пропорционально размерности пространства, в котором заданы эти вектора. Возникающие при это длинные дуги могут быть заменены несколькими короткими пересылками между соседями.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Недостаток &#039;&#039;&#039;параллельной реализации классического алгоритма Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;Dongarra J., Madsen K., Wasniewski J. Applied Parallel Computing: State of the Art in Scientific Computing. – Springer Science &amp;amp; Business Media, 2006. – V. 3732.&amp;lt;/ref&amp;gt; в том, что для матриц с высоким числом обусловленности на входе, система векторов на выходе алгоритма не всегда ортогональна&amp;lt;ref&amp;gt;Björck Å. Numerics of gram-schmidt orthogonalization //Linear Algebra and Its Applications. – 1994. – V. 197. – pp. 297-316.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Итеративно-параллельный классический алгоритм Грама-Шмидта&#039;&#039;&#039; cодержит процедуру итеративной реортогонализации, который даёт возможность избежать недостатков предыдущего метода&amp;lt;ref&amp;gt;[http://www.cerfacs.fr/algor/reports/2002/TR_PA_02_33.pdf Giraud L., Langou J., Rozloznık M. On the round-off error analysis of the Gram-Schmidt algorithm with reorthogonalization.] — &#039;&#039;Technical Report TR/PA/02/33&#039;&#039;, CERFACS, Toulouse, France, 2002.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Блочно-параллельный алгоритм Грама-Шмидта&#039;&#039;&#039;&amp;lt;ref&amp;gt;[http://onlinelibrary.wiley.com/doi/10.1002/1099-1506(200005)7:4%3C219::AID-NLA196%3E3.0.CO;2-L/epdf Vanderstraeten D. An accurate parallel block Gram–Schmidt algorithm without reorthogonalization.] — &#039;&#039;Numerical linear algebra with applications.&#039;&#039;&#039; — 2000. — V. 7. — №. 4. — pp. 219-236.&amp;lt;/ref&amp;gt;  —   версия параллельного алгоритма Грама-Шмидта, использующая оптимизированные по использованию кэша матричные операции&amp;lt;ref&amp;gt; Dongarra J. J. et al. An extended set of Fortran basic linear algebra subroutines — &#039;&#039;ACM Trans. Math. Soft.&#039;&#039; — 1988. — V. 14. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;,&amp;lt;ref&amp;gt;[http://www.maths.manchester.ac.uk/~sven/pubs/Level3BLAS-1-TOMS16-90.pdf Dongarra J. J. et al. A set of level 3 basic linear algebra subprograms.]  — &#039;&#039;ACM Transactions on Mathematical Software (TOMS)&#039;&#039; — 1990. — V. 16. — №. 1. — pp. 1-17.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Анализ последовательной реализации алгоритма Грама-Шмидта с помощью инструмента [http://valgrind.org/docs/manual/cl-manual.html| callgrind] показывает, что наибольшую долю &amp;lt;math&amp;gt;\big(&amp;lt;/math&amp;gt;&lt;br /&gt;
более 97% для &amp;lt;math&amp;gt;k=n=512\big)&amp;lt;/math&amp;gt; процессорного времени использует процесс вычитания проекций нормированного вектора от остальных векторов. Этот процесс состоит из вложенных циклов - в одном из циклов происходит итерация по векторам, а в другом - по подпространствам. Таким образом, задача допускает следующие варианты параллельных реализаций:&lt;br /&gt;
* Распараллеливание по векторам.&lt;br /&gt;
Векторы распределяются по MPI-процессам. После нормировки очередного вектора процесс рассылает его остальным с помощью процедур групповой коммуникации. В исследуемой реализации используется вызов MPI_Bcast.&lt;br /&gt;
* Распараллеливание по векторам (b)&lt;br /&gt;
Так как рассылать очередной вектор необходимо не всем процессам, а только тем, которые содержат ещё не обработанные векторы, перед вызовом Bcast можно создавать новый коммуникатор, содержащий только необходимые процессы. Оптимальность данного способа реализации не исследовалась.&lt;br /&gt;
* Распараллеливание по подпространствам.&lt;br /&gt;
Так как последовательная программа содержит операции скалярного произведения, можно назначить каждому MPI-процессу некоторое подпространство. Скалярное произведение при этом подсчитывается при помощи операции Allreduce.&lt;br /&gt;
Данная реализация является менее оптимальной, так как содержит &amp;lt;math&amp;gt;\frac{k(k-1)}{2}&amp;lt;/math&amp;gt; операций групповой коммуникации, в отличие от k операций для предыдущих реализаций.&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Проводились исследования двух параллельных реализаций метода ортогонализации Грама-Шмидта с использованием OpenMP и MPI.&lt;br /&gt;
Для OpenMP версии проводились испытания на суперкомпьютере IBM Regatta суперкомпьютерного комплекса Московского университета со следующими значениями параметров:&lt;br /&gt;
*число процессоров [1:16] с шагом 1&lt;br /&gt;
*размер матрицы [192:3072] с шагом 192&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*Минимальная эффективность реализации 0.20%&lt;br /&gt;
*Максимальная эффективность реализации 11.18%&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSOMPperformance.png|thumb|center|720px|Рисунок 2. График производительности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GsOMPefficiency.png|thumb|center|720px|Рисунок 3. График эффективности OpenMP реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Оценим значения масштабируемости данной реализации:&lt;br /&gt;
*По размеру задачи: 0.0002905. При увеличении размерности задачи эффективность алгоритма медленно возрастает. Если рассматривать изменение эффективности при фиксированном числе процессоров, то большему числу процессоров соответствует более быстрый рост эффективности, начинающийся от более низкого начального значения. Малое значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0002463. С увеличением значения этой характеристики наблюдается слабое снижение эффективности работы параллельной реализации алгоритма. Эффективность снижается на всей области параметров, однако при большей размерности задачи явление начинает проявляться при больших значениях числа процессоров. Это связано с ростом накладных расходов на обеспечение их работы и взаимодействия. При слишком высоком числе процессоров, использованных для решения задачи малой размерности на эти побочные расходы может приходиться основная доля задействованных ресурсов.&lt;br /&gt;
*По двум направлениям: 0.0000015. Еще более низкий по сравнению с предыдущими характеристиками порядок этой величины свидетельствует о том, что рост эффективности при одновременном увеличении параметров запуска на значения соответствующих шагов хотя и присутствует, но является практически незначительным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для MPI версии испытания  проводились на суперкомпьютере &amp;quot;Ломоносов&amp;quot; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета] со следующими значениями параметров: &lt;br /&gt;
*число процессоров [8:128] с шагом 8&lt;br /&gt;
*размер матрицы [256:3840] с шагом 256&lt;br /&gt;
&lt;br /&gt;
В результате экспериментов получен следующий диапазон значений эффективности реализации алгоритма:&lt;br /&gt;
*Минимальная эффективность реализации 0.008%&lt;br /&gt;
*Максимальная эффективность реализации 10.00%&lt;br /&gt;
&lt;br /&gt;
На рисунках приведены графики производительности и эффективность исследованной реализации алгоритма в зависимости от числа процессоров и размера матрицы.&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIPerformance.png|thumb|center|720px|Рисунок 4. График производительности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&lt;br /&gt;
[[File:GSMPIEfficiency.png|thumb|center|720px|Рисунок 5. График эффективности MPI реализации алгоритма в зависимости от числа процессоров и размера входной матрицы]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
Аналогично с предыдущей, оценим значения масштабируемости данной реализации, поведение алгоритма во многом схоже:&lt;br /&gt;
*По размеру задачи: 0.0001318. Аналогично OpenMP, при увеличении размерности задачи эффективность алгоритма возрастает, несмотря на разброс значений. Большему числу процессоров также соответствует более быстрый рост эффективности. Малое положительное значение масштабируемости по этому параметру говорит о слабом росте во всей области рассмотренных параметров. &lt;br /&gt;
*По числу процессоров: -0.0003073. Снижение эффективности реализации алгоритма также связано с растущими накладными расходами, в частности на пересылки данных между процессорами. &lt;br /&gt;
*По двум направлениям: -0.000006103. По сравнению с OpenMP реализацией здесь общая масштабируемость имеет отрицательное значение, однако столь же малое абсолютное значение. Общее снижение эффективности с одновременным увеличением параметров выполнения алгоритма слабо выражено.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Число математических операций в исследуемом параллельном алгоритме пропорционально &amp;lt;math&amp;gt;\frac{1}{p^2}&amp;lt;/math&amp;gt;, где p - число параллельных процессов, поэтому для большого числа процессов значительное время занимают операции групповой коммуникации.&lt;br /&gt;
Эффективность работы процедуры MPI_Bcast зависит от топологии коммуникационной сети. Например, передача данных между ядрами одного узла происходит на порядки быстрее, чем на ядра соседнего узла. Таким образом, MPI_Bcast работает наиболее эффективно, когда задействованы все ядра некоторого числа узлов.&lt;br /&gt;
&lt;br /&gt;
Мы предполагаем, что множественные особенности графиков для реализации с MPI связаны с тем, что на некоторых конфигурациях запуска были загружены не все ядра одного из узлов. Кроме того, если число векторов не делилось на число процессов, некоторые процессы хранили меньше векторов, чем остальные, что уменьшало эффективность работы параллельного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[https://bitbucket.org/kibandrey/gram-shmidt-orthogonalization/src/d720b3d3fbdd07e9d839992635cc67d2efe29522 Исследованные реализации алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[http://maxima.sourceforge.net/docs/manual/maxima_23.html#gramschmidt Maxima], &lt;br /&gt;
:*[https://reference.wolfram.com/language/ref/Orthogonalize.html# Mathematica],&lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab].&lt;br /&gt;
&lt;br /&gt;
Также метод реализован в библиотеке [http://www.spectralpython.net/class_func_ref.html#spectral.algorithms.algorithms.orthogonalize SpectralPython] для языка Python. Для устранения проблемы ошибок численных округлений иногда используется повторное применение метода к уже построенному ортогональному базису. &lt;br /&gt;
&lt;br /&gt;
Поскольку метод ортогонализации Грама–Шмидта гарантирует получение &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ортогональных векторов к концу шага &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, а не в самом конце работы алгоритма, используется в итерационных методах, таких как метод Арнольди. Для поддержки работы этого метода реализация ортогонализации Грама–Шмидта включена в библиотеку [http://trac.alcf.anl.gov/projects/libs/browser/ARPACK/PARPACK/SRC/MPI/pzgetv0.f/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Amelie</name></author>
	</entry>
</feed>