<?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=Sergeys79</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=Sergeys79"/>
	<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/Sergeys79"/>
	<updated>2026-10-23T01:50:01Z</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:%D0%91%D0%BE%D0%B1%D1%86%D0%BE%D0%B2_%D0%91%D0%BE%D1%80%D0%B8%D1%81/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=14004</id>
		<title>Участник:Бобцов Борис/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:%D0%91%D0%BE%D0%B1%D1%86%D0%BE%D0%B2_%D0%91%D0%BE%D1%80%D0%B8%D1%81/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=14004"/>
		<updated>2016-10-26T13:28:29Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &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( n \right) &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - количество подотрезков, на которые разбился исходный отрезок&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt; log(n) &amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;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;
| output_data       = &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; число&lt;br /&gt;
}}&lt;br /&gt;
Автор статьи: [[Участник:Stalles|Бобцов Борис]] (группа 619)&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;I = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt; от непрерывной функции &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;. Если может быть найдена первообразная &amp;lt;math&amp;gt;F(x)&amp;lt;/math&amp;gt; подынтегральной функции, то по формуле Ньютона-Лейбница:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\int_a^b{f(x)dx} = F(b) - F(a). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если же первообразная не может быть найдена, то для вычисления интеграла прибегают к приближённым формулам, точность которых может быть сделана сколь угодно большой.&lt;br /&gt;
&lt;br /&gt;
Приближённые методы вычисления определённого интеграла в большинстве случаев основаны на том, что определённый интеграл численно равен площади криволинейной трапеции, ограниченной кривой &amp;lt;math&amp;gt; y =f(x)&amp;lt;/math&amp;gt;, сегментом &amp;lt;math&amp;gt; \left[ a,b \right] &amp;lt;/math&amp;gt; оси &amp;lt;math&amp;gt;Ox&amp;lt;/math&amp;gt; и вертикальными прямыми &amp;lt;math&amp;gt;x = a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;x = b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&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; \epsilon &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; найденным с точностью &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt;, если выполнено условие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n_2 &amp;lt;/math&amp;gt; - количество узлов, образующих две разные сетки.&lt;br /&gt;
&lt;br /&gt;
==== Метод рекурсивного деления ====&lt;br /&gt;
&lt;br /&gt;
Метод трапеций обладает следующими недостатками:&lt;br /&gt;
* в некоторых точках значение функции будет вычисляться несколько раз;&lt;br /&gt;
* на всём интервале интегрирования используется равномерная сетка, тогда как число точек, необходимых для достижения заданной точности, зависит от вида функции и может сильно различаться на разных участках сегмента интегрирования.&lt;br /&gt;
&lt;br /&gt;
Метод рекурсивного деления был придуман, чтобы избежать этих недостатков. Суть метода заключается в рекурсивном вызове себя до момента, пока мы не достигнем нужной точности:&lt;br /&gt;
&amp;lt;math&amp;gt; I(a,b) = IntTrap(a, b, f(a), f(b)) = IntTrap(a, (b - a) / 2, f(a), f((b - a) / 2)) + IntTrap((b - a) / 2, b, f((b - a) / 2), f(b)) = ...  &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Однако можно заметить, что координаты концов обрабатываемых отрезков  хранятся в программном стеке процесса &amp;lt;math&amp;gt;IntTrap() &amp;lt;/math&amp;gt;, и недоступны программисту. Это является основной сложностью при построении параллельного алгоритма на основе метода рекурсивного деления.&lt;br /&gt;
&lt;br /&gt;
====Метод локального стека ====&lt;br /&gt;
&lt;br /&gt;
Данный алгоритм использует массив данных, доступ к которым осуществляется по принципу стека - первым удаляется последний из добавленных элементов. Теперь у разных процессов есть возможность обрабатывать отрезки независимо друг от друга. В рассматриваемом алгоритме вместо стека можно было использовать и другие способы хранения заданий, например очередь. Стек выбран исключительно из соображений простоты реализации. Алгоритм локального стека можно считать наилучшим из перечисленных последовательных методов для разработки его параллельной версии.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
В схеме реализации будет явно видно, что алгоритм реализуется при помощи цикла, внутри которого происходит подсчет текущих частичных сумм и проверка достигнутой точности. Сложность данного алгоритма зависит от количества проходов по циклу линейно, поэтому можно считать, что тело этого цикла и является вычислительным ядром данного алгоритма.&lt;br /&gt;
&lt;br /&gt;
[[Файл:123321.png]]&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для упрощения основной функции и улучшения восприятия основного алгоритма необходимые процедуры работы с локальным стеком были вынесены и описаны в этот раздел. Кроме того, для сокращения текста программ опущен код, обеспечивающий контроль переполнения и исчерпания стека.&lt;br /&gt;
&lt;br /&gt;
    int sp = 0;       //указатель вершины стека&lt;br /&gt;
&lt;br /&gt;
    struct&lt;br /&gt;
    {&lt;br /&gt;
        double a;&lt;br /&gt;
        double b;&lt;br /&gt;
        double fa;&lt;br /&gt;
        double fb;&lt;br /&gt;
        double sab;&lt;br /&gt;
    } stk[1000];      //массив структур, в которых хранятся отложенные значения. 1000 может быть заменена на необходимое число&lt;br /&gt;
&lt;br /&gt;
    //макроопределения доступа к данным стека&lt;br /&gt;
    #define STACK_IS_NOT_FREE ( sp &amp;gt; 0 )&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK( a, b, fa, fb, sab )&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].a = a;&lt;br /&gt;
        stk[sp].b = b;&lt;br /&gt;
        stk[sp].fa = fa;&lt;br /&gt;
        stk[sp].fb = fb;&lt;br /&gt;
        stk[sp].sab = sab;&lt;br /&gt;
        ++sp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK( a, b, fa, fb, sab )&lt;br /&gt;
    {&lt;br /&gt;
        --sp;&lt;br /&gt;
        a = stk[sp].a;&lt;br /&gt;
        b = stk[sp].b;&lt;br /&gt;
        fa = stk[sp].fa;&lt;br /&gt;
        fb = stk[sp].fb;&lt;br /&gt;
        sab = stk[sp].sab;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Будем считать, что описана функция double f( double x ), возвращающая значение f(x) интегрируемой функции f в точке x.&lt;br /&gt;
&lt;br /&gt;
    double f( double x );&lt;br /&gt;
&lt;br /&gt;
    int IntTrap(a, b)&lt;br /&gt;
    {&lt;br /&gt;
        double I = 0;        //значение интеграла&lt;br /&gt;
        double fa = f( a );  //значение функции &amp;lt;math&amp;gt;y = f(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
        double fb = f( b );  //значение функции &amp;lt;math&amp;gt;y = f(x)&amp;lt;/math&amp;gt; в точке &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;&lt;br /&gt;
        double c = 0;        //середина отрезка интегрирования&lt;br /&gt;
        double sab = 0;      //&lt;br /&gt;
        double sac = 0;      //&lt;br /&gt;
        double scb = 0;      //&lt;br /&gt;
        double sabc = 0;     //переменные для подсчёта текущих сумм&lt;br /&gt;
        while( 1 )&lt;br /&gt;
        {&lt;br /&gt;
            c = ( a + b ) / 2;&lt;br /&gt;
            fc = f( c );&lt;br /&gt;
            sac = ( fa + fc ) * ( c - a ) / 2;&lt;br /&gt;
            scb = ( fc + fb ) * ( b - c ) / 2;&lt;br /&gt;
            sabc = sac + scb;&lt;br /&gt;
            if( abs( sab - sacb ) &amp;gt;= &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; * abs ( sacb ) ) //&amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; - заданная точность&lt;br /&gt;
            {&lt;br /&gt;
                PUT_INTO_STACK( a, c, fa, fc, sac );&lt;br /&gt;
                a = c; &lt;br /&gt;
                fa = fc;&lt;br /&gt;
                sab = scb;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                I += sacb;&lt;br /&gt;
                if( STACK_IS_NOT_FREE )&lt;br /&gt;
                {&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
                GET_FROM_STACK( a, b, fa, fb, sab );&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return I;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Пусть для работы алгоритма было необходимо разбить отрезок &amp;lt;math&amp;gt; \left[a, b\right] &amp;lt;/math&amp;gt; на сегменты &amp;lt;math&amp;gt; \left[a=x_0 , x_1\right], \left[a=x_1 , x_2\right],... \left[a=x_{n-1} , x_n = b\right] &amp;lt;/math&amp;gt;.&lt;br /&gt;
Так как каждый раз, когда нам приходится вычислять площадь трапеции на более коротком сегменте, мы делим отрезок пополам, получаем, что длина каждого отрезка равна &amp;lt;math&amp;gt; \left( x_i - x_{i - 1} \right) = \frac{b - a}{2^k} &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; k &amp;lt;/math&amp;gt; из всех &amp;lt;math&amp;gt; k_i : \left( x_i - x_{i - 1} \right) = \frac{b - a}{2^{k_i}} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Очевидно, что для каждой функции &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; и для каждой точности &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; глубина алгоритма будет разной. То есть можно считать, что &amp;lt;math&amp;gt; k = k(f(x), \epsilon). &amp;lt;/math&amp;gt; Также понятно, что, если &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;- глубина алгоритма при фиксированных &amp;lt;math&amp;gt; y &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt;, то максимально возможное количество полученных отрезков, для которых считалась частичная сумма, и количество точек на отрезке &amp;lt;math&amp;gt; \left[a, b\right] &amp;lt;/math&amp;gt; равны соответственно &amp;lt;math&amp;gt; 2^k &amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt; 2^k + 1 &amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt; k_i = k, i = 1,2,...,n &amp;lt;/math&amp;gt;. В этом худшем с точки зрения количества операций случае алгоритм прокрутит цикл while( 1 ) &amp;lt;math&amp;gt; 1 + 2 + 4 + ... + 2^k = (2^{k + 1}-1) &amp;lt;/math&amp;gt;   раз.&lt;br /&gt;
&lt;br /&gt;
Если не учитывать при расчёте сложности операции работы с памятью, а только сложения/вычитания и умножения*деления, получим, что за каждый выполненный цикл while( 1 ) алгоритм выполняет 7 сложений и 6 умножений. Итого получаем в худшем случае &amp;lt;math&amp;gt; 7*2^k &amp;lt;/math&amp;gt; сложений и &amp;lt;math&amp;gt; 6*2^k &amp;lt;/math&amp;gt; умножений. Кроме этого, алгоритм посчитает значение &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; точках. При этом понятно, что &amp;lt;math&amp;gt; k \leq log(n). &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Получаем, что при разбиении исходного отрезка на &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; подотрезков получаем глубину алгоритма &amp;lt;math&amp;gt; k \leq log(n) &amp;lt;/math&amp;gt; и  сложность алгоритма &amp;lt;math&amp;gt; O\left( n + 2^{log n} \right) = O\left( n + n \right) = O\left( n  \right) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом из всего вышесказанного сразу видно, что при достаточном количестве вычислительных ресурсов распараллеливания высота ярусно-параллельной формы параллельной программы будет равна глубине &amp;lt;math&amp;gt; k \leq log(n), &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;
&lt;br /&gt;
[[Файл:12321.png]]&lt;br /&gt;
&lt;br /&gt;
На рисунке овалом изображён стек, в котором будем хранить отрезки, сами отрезки представлены точками - вершинами графа. Стрелками - дугами обозначено дробление отрезков на два новых, вдвое меньших предыдущего. В целях наглядности отрезки одинаковой длины были сгруппированы в один слой (ярус) и помещены в один стек. Через &amp;lt;math&amp;gt; k &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;
&lt;br /&gt;
*если из текущей точки выходят стрелки вправо, то:&lt;br /&gt;
**идти по самой верхней из тех, по которым не ходили, направо;&lt;br /&gt;
*иначе:&lt;br /&gt;
**если мы побывали во всех точках графа (или в терминах стека, если стек пуст), то:&lt;br /&gt;
***конец работы.&lt;br /&gt;
**иначе:&lt;br /&gt;
***идти по стрелке, которая входит в текущую точку, налево.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм обладает хорошим ресурсом параллелизма. В самом деле, пусть в нашем распоряжении есть доступный всем параллельным процессам список отрезков интегрирования, организованный в виде стека. Назовём его глобальным стеком. Предположим, что перед запуском параллельных процессов в глобальный стек помещается единственная запись - координаты концов отрезка интегрирования - в дальнейшем - &amp;quot;отрезок&amp;quot;. Тогда возможно реализовать следующую схему алгоритма, выполняемую каждым из параллельных процессов:&lt;br /&gt;
&lt;br /&gt;
Пока в глобальном стеке есть отрезки:&lt;br /&gt;
*взять один отрезок из глобального стека;&lt;br /&gt;
*выполнить алгоритм локального стека, выполняя при записи в локальный стек следующие операции:&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;: &lt;br /&gt;
* функция &amp;lt;math&amp;gt; y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt; a, b.&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;I &amp;lt;/math&amp;gt;, приближённо равное &amp;lt;math&amp;gt; \int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&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; \frac{n}{log(n)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.7 Существующие реализации алгоритма&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
На данный момент реализация алгоритма локального стека была указана только в книге Якобовского М.В., Кульковой Е.Ю. &amp;quot;Решение задач на многопроцессорных вычислительных системах с разделяемой памятью.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&lt;br /&gt;
# Шнейдер В. Е. и др. Краткий курс высшей математики. Учеб. пособие для втузов. М., «Высш. школа», 1972. 640 с.&lt;br /&gt;
# Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Sergeys79</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B0:Sannikovats/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8_(1)&amp;diff=14003</id>
		<title>Участница:Sannikovats/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D0%B0:Sannikovats/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8_(1)&amp;diff=14003"/>
		<updated>2016-10-26T13:28:11Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Вычисление определённого интеграла с использованием адаптивно сгущающейся сетки&lt;br /&gt;
| input_data        = 1 функция,зависящая от 1 переменной, 3 числа ( точность ε и границы отрезка интегрирования[A,B])&lt;br /&gt;
| output_data       = 1 число&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания:[[Участница:Sannikovats| Санникова Татьяна Сергеевна]],[[Участник:Plukshin| Лукшин Петр Андреевич]].&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Допустим, нам дана функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; , определенная на отрезке, и возможность получать ее численное значение в любой из точек области определения за фиксированное время. Задача — вычислить определенный интеграл данной функции по заданной области и дать оценку погрешности вычисления.&amp;lt;br /&amp;gt; В случае, когда можно вычислить интеграл по формуле Ньютона-Лейбница, зная первообразную искомой функции, проблем не возникает. Однако, если первообразной нет, решение можно получить благодаря численным методам. Так определенному интегралу можно дать простую геометрическую интерпретацию  - он равен площади криволинейной трапеции, ограниченной слева и справа вертикальными прямыми x=a, x=b, снизу  -  прямой y=0, а сверху  –  кривой y=f(x).&lt;br /&gt;
&lt;br /&gt;
Существуют различные последовательные методы построения адаптивных подвижных сеток, которые позволяют значительно повысить точность вычисления определенного интеграла за счет учета характера изменения подынтегральной функции. Представим общее описание для методов рекурсивного деления и локального стека.&lt;br /&gt;
&lt;br /&gt;
====Метод рекурсивного деления====&lt;br /&gt;
&lt;br /&gt;
Простейший из них - это метод рекурсивного деления, выигрыш от применения которого достигается за счет возможности использования сеток с разным числом узлов на разных участках интервала интегрирования. Интервал интегрирования разбивается на две части и независимо интегрируется функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt; на каждой из них при соответствующих шагах интегрирования. Процедуру разбиения отрезков можно рекурсивно повторить до получения отрезков, на которых подынтегральная функция имеет простой вид и может быть аппроксимирована отрезком прямой с заданной точностью. Но при распараллеливании этого алгоритма (т.е. при запуске попарно подпрограмм, обрабатывающих половинки разбиваемого интервала) можно столкнуться со следующей проблемой: в реальной системе число процессоров ограничено и время, необходимое для порождения параллельных процессов существенно не равно нулю. А значит, запуск процессов, число которых значительно превышает число физических процессов системы при решении рассматриваемой задачи, приводит к увеличению времени ее решения по сравнению с последовательной программой. Основная сложность построения параллельного алгоритма на основе рассмотренного последовательного алгоритма, кроется в том, что, хотя несколько ветвей программы могли бы одновременно обрабатывать разные части интервала интегрирования, координаты концов этих отрезков хранятся в программном стеке процесса и фактически недоступны программисту. Если бы они были расположены в некотором явно описанном массиве, можно было бы передать их по частям для обработки разным нитям программы. Поэтому, необходимо рассмотреть метод локального стека, позволяющий распределить вычислительную работу между ограниченным числом процессов.&lt;br /&gt;
&lt;br /&gt;
====Метод локального стека====&lt;br /&gt;
&lt;br /&gt;
В основе этого алгоритма лежит описанный выше метод рекурсивного деления. Только данный метод использует массив данных, доступ к которым осуществляется по принципу стека - первым удаляется последний из добавленных элементов. В рассматриваемом алгоритме вместо стека можно было использовать и другие способы хранения заданий, например очередь. Стек выбран исключительно из соображений простоты реализации. Времена выполнения рассмотренных алгоритмов отличаются примерно на 5% в пользу локального стека, таким образом, алгоритм &amp;quot;локального стека&amp;quot; будем считать наилучшим из имеющихся в нашем распоряжении последовательных методов и на его примере построим дальнейшее описание.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Входные данные:&#039;&#039; заданная функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке &amp;lt;math&amp;gt;[A,B]&amp;lt;/math&amp;gt;, заданная точность решения ε.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Выходные данные:&#039;&#039; число, представляющее собой приближенное значение интеграла.&amp;lt;br /&amp;gt;&lt;br /&gt;
В качестве модельной задачи рассматривается проблема вычисления с точностью ε значения определенного интеграла   &amp;lt;br /&amp;gt;                                        &lt;br /&gt;
[[Файл:1.jpg]]&lt;br /&gt;
 &lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [A,B] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = A + \frac{(B - A)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f(x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[A,B]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&amp;lt;math&amp;gt; J_n(A,B)=\int_A^B{f(x)dx} = \frac{B - A}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл: 2sann.jpg]] [[Файл:3sann.jpg]]&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt; найденным с точностью &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt;, если выполнено условие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |J_{n_1} - J_{n_2}| \leq \epsilon |J_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n_2 &amp;lt;/math&amp;gt; - количество узлов, образующих две разные сетки.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Используемые в алгоритме формулы:&amp;lt;br /&amp;gt;&lt;br /&gt;
*Из метода трапеций &amp;lt;math&amp;gt;sAB=\frac{f(A)+f(B)}{2}*(B-A)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Основное время работы алгоритма приходится на:&amp;lt;br /&amp;gt;&lt;br /&gt;
#нахождение середины отрезка и значения функции в этой точке;&amp;lt;br /&amp;gt;&lt;br /&gt;
#вычисление частичных сумм на подобластях методом трапеций;&amp;lt;br /&amp;gt;&lt;br /&gt;
#определение выполнения условия точности:&lt;br /&gt;
#*если не выполняется, то продолжаем дробить область,&amp;quot;закладывая&amp;quot; в стек границы нового интервала, &lt;br /&gt;
#*иначе добавляем к результату вычисленную сумму, завершая цикл. &lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
В реализации алгоритма используется такая структура данных, как стек, в котором хранятся координаты концов отрезков.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
//Данные, описывающие стек&lt;br /&gt;
int sp = 0; // Указатель вершины стека&lt;br /&gt;
&lt;br /&gt;
// Массив структур, в которых хранятся отложенные задания&lt;br /&gt;
struct mstk {&lt;br /&gt;
	double A;//координата левой границы отрезка интегрирования&lt;br /&gt;
	double B;//координата правой границы отрезка интегрирования&lt;br /&gt;
	double fA;//значение функции на границе A&lt;br /&gt;
	double fB;//значение функции на границе B&lt;br /&gt;
	double s;//частичная сумма&lt;br /&gt;
} mstk[N];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В процедурах работы со стеком доступны следующие операции: &amp;lt;br /&amp;gt; &lt;br /&gt;
1)Проверка наличия элементов в стеке:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define STACK_IS_NOT_FREE (sp &amp;gt; 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
2)Операция &amp;quot;положить в стек&amp;quot;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define PUT_INTO_STACK(A, B, fA, fB, s) {&lt;br /&gt;
	mstk[sp].A = A;&lt;br /&gt;
	mstk[sp].B = B;&lt;br /&gt;
	mstk[sp].fA = fA;&lt;br /&gt;
	mstk[sp].fB = fB;&lt;br /&gt;
	mstk[sp].s = s;&lt;br /&gt;
	++sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
3)Операция &amp;quot;взять из стека верхний элемент&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#define GET_FROM_STACK(A, B, fA, fB, s) {&lt;br /&gt;
	--sp;&lt;br /&gt;
	A = mstk[sp].A;&lt;br /&gt;
	B = mstk[sp].B;&lt;br /&gt;
	fA = mstk[sp].fA;&lt;br /&gt;
	fB = mstk[sp].fB;&lt;br /&gt;
	s = mstk[sp].s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
// Заданная функция f(x)&lt;br /&gt;
double f(double x);&lt;br /&gt;
&lt;br /&gt;
Рассмотрим функцию JLS, вычисляющую определенный интеграл от f(x) на [A,B] с заданной точностью eps методом локального стека, которая является вычислительным ядром алгоритма:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int JLS(double A, double B, double eps) {&lt;br /&gt;
	double J = 0;//значение интеграла&lt;br /&gt;
	double fA = f(A);//значение функции f(x)на границе A&lt;br /&gt;
	double fB = f(B);//значение функции f(x)на границе B&lt;br /&gt;
	double C;//середина отрезка [A,B]&lt;br /&gt;
	double fC;//значение функции f(x)в середине отрезка [A,B]&lt;br /&gt;
	double sAB = (fA + fB)*(B - A)/2;//вычисление площади трапеции с основанием AB&lt;br /&gt;
	double sAC;//площадь трапеции с основанием AС&lt;br /&gt;
	double sCB;//площадь трапеции с основанием СВ&lt;br /&gt;
	double sACB;//сумма sAC и sCB&lt;br /&gt;
	while(1) {&lt;br /&gt;
		C = (A + B)/2;//середина отрезка &lt;br /&gt;
		fC = f(C);&lt;br /&gt;
		sAC = (fA + fC)*(C - A)/2;&lt;br /&gt;
		sCB = (fC + fB )*(B - C)/2;&lt;br /&gt;
		sACB = sAC + sCB;&lt;br /&gt;
                  //проверка выполнения условия на порядок точности:&lt;br /&gt;
		if(abs(sAB - sACB) &amp;gt;= eps*abs(sACB)) {&lt;br /&gt;
			PUT_INTO_STACK(A, C, fA, fC, sAC);&lt;br /&gt;
			A = C;&lt;br /&gt;
			fA = fC;&lt;br /&gt;
			sAB = sCB;&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			J += sACB;&lt;br /&gt;
			if(STACK_IS_NOT_FREE) {&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
			GET_FROM_STACK(A, B, fA, fB, sAB);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return J;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Оценить аналитически последовательную сложность представленного алгоритма невозможно в силу того, что нельзя указать количество разбиений отрезка интегрирования для каждой отдельно взятой функции.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
*Пусть есть доступный всем параллельным процессам список отрезков интегрирования,организованный в виде стека. Назовем его глобальным стеком.&lt;br /&gt;
*Пусть у каждого процесса есть свой, доступный только этому процессу локальный стек&lt;br /&gt;
*Перед запуском параллельных процессов в глобальный стек помещается единственная запись (в дальнейшем &amp;quot;отрезок&amp;quot;):&lt;br /&gt;
    координаты концов отрезка интегрирования, &lt;br /&gt;
    значения функции на концах,&lt;br /&gt;
    приближенное значение интеграла на этом отрезке.&lt;br /&gt;
*Тогда, предлагается следующая схема алгоритма, выполняемого каждым из параллельных процессов:&lt;br /&gt;
&lt;br /&gt;
Пока в глобальном стеке есть отрезки:&lt;br /&gt;
*взять один отрезок из глобального стека&lt;br /&gt;
*выполнить алгоритм локального стека, но,если при записи в локальный стек в нем есть несколько отрезков, а в глобальном стеке отрезки отсутствуют, то переместить часть отрезков из локального стека в глобальный стек&lt;br /&gt;
* по исчерпании локального стека добавить полученную частичную сумму к общему значению интеграла.&lt;br /&gt;
 &lt;br /&gt;
[[Файл:luksh.jpg]]&lt;br /&gt;
На рисунке изображен информационный граф, где k - это глубина алгоритма, а + обозначено суммирование площадей трапеций.&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; заданная функция &amp;lt;math&amp;gt;f(x)&amp;lt;/math&amp;gt;, определенная на отрезке &amp;lt;math&amp;gt;[A,B]&amp;lt;/math&amp;gt;, заданная точность решения ε.&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;Выходные данные:&#039;&#039; число, представляющее собой приближенное значение интеграла.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Рассмотренный алгоритм обладает свойством детерминированности, поскольку при определенных входных данных мы будем получать одинаковый результат. При этом он может адаптироваться в зависимости от сложности подынтегральной функции.&lt;br /&gt;
Кроме того, алгоритм обладает внутренним параллелизмом, так как является численно устойчивым как в последовательной, так и в параллельной версиях.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
В настоящее время проблемой вычисления определенного графа на адаптивной сетке по нашим сведениям занимались только М.В. Якобовский и Е.Ю. Кулькова, рассматривавшие в своей работе &amp;quot;РЕШЕНИЕ ЗАДАЧ НА МНОГОПРОЦЕССОРНЫХ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМАХ С РАЗДЕЛЯЕМОЙ ПАМЯТЬЮ&amp;quot; методы локального и глобального стеков.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
Якобовский М.В. &lt;br /&gt;
Введение в параллельные методы решения задач&lt;br /&gt;
М.В. Якобовский и Е.Ю. Кулькова &amp;quot;РЕШЕНИЕ ЗАДАЧ НА МНОГОПРОЦЕССОРНЫХ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМАХ С РАЗДЕЛЯЕМОЙ ПАМЯТЬЮ&amp;quot;&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=14002</id>
		<title>Участник:Greno4ka/Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки</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:Greno4ka/%D0%92%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D0%BB%D0%B0_%D1%81_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE_%D1%81%D0%B3%D1%83%D1%89%D0%B0%D1%8E%D1%89%D0%B5%D0%B9%D1%81%D1%8F_%D1%81%D0%B5%D1%82%D0%BA%D0%B8&amp;diff=14002"/>
		<updated>2016-10-26T13:27:57Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы: [[User:Greno4ka|Устинов Г.А.]] [[User:Лиджиев_Данир_Владимирович|Лиджиев Д.В.]]&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&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;I(a,b) = \int_a^b{f(x)dx}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на отрезке &amp;lt;math&amp;gt; [a,b] &amp;lt;/math&amp;gt; задана равномерная сетка, содержащая &amp;lt;math&amp;gt; n+1 &amp;lt;/math&amp;gt; узел:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{i} = a + \frac{(b - a)} {n} i,   i = 0,...,n &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда, согласно методу трапеций, можно численно найти определенный интеграл от функции &amp;lt;math&amp;gt; f (x) &amp;lt;/math&amp;gt; на отрезке &amp;lt;math&amp;gt;[a,b]&amp;lt;/math&amp;gt;: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \int_a^b{f(x)dx} = \frac{b - a}{n} \left( \frac{f(x_0)}{2} + \sum^{n-1}_{i=1} {f(x_i)}  + \frac{f(x_n)}{2} \right)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем полагать значение I найденным с точностью ε, если выполнено условие&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; |I_{n_1} - I_{n_2}| \leq \epsilon |I_{n_2}|, n_1 &amp;gt; n_2, &amp;lt;/math&amp;gt;&lt;br /&gt;
где &amp;lt;math&amp;gt;  n_1 &amp;lt;/math&amp;gt; и  &amp;lt;math&amp;gt; n_2 &amp;lt;/math&amp;gt; - количество узлов, образующих две разные сетки.&lt;br /&gt;
&lt;br /&gt;
Данный метод неэффективен в силу ряда причин:&lt;br /&gt;
* в некоторых точках значение функции будет вычисляться несколько раз;&lt;br /&gt;
* на всём интервале интегрирования используется равномерная сетка, тогда как число точек, необходимых для достижения заданной точности, зависит от вида функции и может сильно различаться на разных участках сегмента интегрирования.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Ниже будет показано, что вычислительное ядро алгоритма состоит из основного цикла алгоритма и сложность зависит от количества проходов по нему.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Метод локального стека&lt;br /&gt;
    sp=0  //    указатель вершины стека&lt;br /&gt;
    struct {&lt;br /&gt;
          A, B, fA, fB, s&lt;br /&gt;
    } stk[1000]&lt;br /&gt;
&lt;br /&gt;
    // макроопределения доступа к данным стека&lt;br /&gt;
&lt;br /&gt;
    #define STACK_IS_NOT_FREE (sp&amp;gt;0)&lt;br /&gt;
&lt;br /&gt;
    #define PUT_INTO_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        stk[sp].A=A&lt;br /&gt;
        stk[sp].B=B&lt;br /&gt;
        stk[sp].fA=fA&lt;br /&gt;
        stk[sp].fB=fB&lt;br /&gt;
        stk[sp].s=s&lt;br /&gt;
        sp++&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    #define GET_FROM_STACK(A, B, fA, fB, s)&lt;br /&gt;
    {&lt;br /&gt;
        sp--&lt;br /&gt;
        A=stk[sp].A&lt;br /&gt;
        B=stk[sp].B&lt;br /&gt;
        fA=stk[sp].fA&lt;br /&gt;
        fB=stk[sp].fB&lt;br /&gt;
        s=stk[sp].s&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
    IntTrap (A, B)&lt;br /&gt;
    {&lt;br /&gt;
        J=0&lt;br /&gt;
        fA = f(A)&lt;br /&gt;
        fB = f(B)&lt;br /&gt;
        sAB = (fA + fB) * (B - A) / 2&lt;br /&gt;
        while (1)&lt;br /&gt;
        {&lt;br /&gt;
            C = (A + B) / 2&lt;br /&gt;
            fc = fun(C) &lt;br /&gt;
            sAC = (fA + fC) * (C - A) / 2&lt;br /&gt;
            sCB = (fC + fB ) * (B-C)/2&lt;br /&gt;
            sACB = sAC + sCB&lt;br /&gt;
            if (|sAB - sACB| ≥ ε|sACB|) {&lt;br /&gt;
                PUT_INTO_STACK(A, C, fA, fC, sAC) &lt;br /&gt;
                A = C&lt;br /&gt;
                fA = fC&lt;br /&gt;
                sAB = sCB&lt;br /&gt;
            } else {&lt;br /&gt;
                J += sACB&lt;br /&gt;
                if (STACK_IS_NOT_FREE)&lt;br /&gt;
                    break &lt;br /&gt;
                GET_FROM_STACK(A, B, fA, fB, sAB)&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        return J &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&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;y = f(x)&amp;lt;/math&amp;gt;;&lt;br /&gt;
* точность &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
* границы отрезка интегрирования &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные:&lt;br /&gt;
* число &amp;lt;math&amp;gt;I&amp;lt;/math&amp;gt;, равное &amp;lt;math&amp;gt;\int_a^b{f(x)dx}&amp;lt;/math&amp;gt; с точностью &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
1. Алгоритм адаптируется под конкретные особенности заданной функции&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&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://alglib.sources.ru/integration/adaptive.php ALGLIB].&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Литература =&lt;br /&gt;
&lt;br /&gt;
Якобовский М.В., Кулькова Е.Ю. Решение задач на многопроцессорных вычислительных системах с разделяемой памятью. - М.: СТАНКИН, 2004. – 30 c.&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Pandvik/%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=14001</id>
		<title>Участник:Pandvik/Ортогонализация Грама - Шмидта</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:Pandvik/%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=14001"/>
		<updated>2016-10-26T13:27:47Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Авторы описания алгоритма: Павлов Андрей, Филимонов Владимир.&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грамма-Шмидта [https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81_%D0%93%D1%80%D0%B0%D0%BC%D0%B0_%E2%80%95_%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0]&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(N^2M)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;NM&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;NM&amp;lt;/math&amp;gt;&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;ref&amp;gt;А.А. Самарский, А.В. Гулин, Численные методы&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта используется для квадратных невырожденных матриц, которые преобразуются, либо уже преобразованы, к верхнему(нижнему) треугольному виду.&lt;br /&gt;
&lt;br /&gt;
Процесс ортогонализации Грама-Шмидта нашёл применение в оптимизации оценивания параметров моделей управления объектом&amp;lt;ref&amp;gt;А.Е. Карелин, А.А. Светлаков, Использование ортогонализации Грама-Шмидта для повышения экономичности многоточечных алгоритмов рекуррентного оценивания параметров моделей объектов управления&amp;lt;/ref&amp;gt;, в протоколах безопасности&amp;lt;ref&amp;gt;А.В. Пискова, А. А. Менщиков, А.Г. Коробейников, Использование ортогонализации Грама-Шмидта в алгоритме приведения базиса решётки для протоколов безопасности&amp;lt;/ref&amp;gt;, в обработке сигналов&amp;lt;ref&amp;gt;МГУ ВМК, Ф.Ф. Дедус, Л.И. Куликова, А.Н. Панкратов, Р.К. Тетуев, Классические ортогональные базисы в задачах аналитического описания и обработки информационных сигналов&amp;lt;/ref&amp;gt;, в вычислении локальных минимумов целочисленных решёток и многом другом.&lt;br /&gt;
&lt;br /&gt;
Обычно, процесс ортогонализации используется как промежуточный шаг в других алгоритмах для уменьшения количества вычислений.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Исходные данные: квадратная матрица A с линейно независимыми векторами &amp;lt;math&amp;gt;\mathbf{a}_1,...,\mathbf{a}_N | \mathbf{a}_i \in \R^{M}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определяется оператор проекции &amp;lt;math&amp;gt;\mathbf{proj}_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\left \langle a,b \right \rangle&amp;lt;/math&amp;gt; - скалярное произведение векторов a и b. Данный оператор используется для проецирования вектора a коллинеарно вектору b.&lt;br /&gt;
&lt;br /&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;\mathbf{b}_2 = \mathbf{a}_2 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_3 = \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_3 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_3 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_4 = \mathbf{a}_4 - \mathbf{proj}_{\mathbf{b}_1} \mathbf{a}_4 - \mathbf{proj}_{\mathbf{b}_2} \mathbf{a}_4 - \mathbf{proj}_{\mathbf{b}_3} \mathbf{a}_4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\vdots&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_N = \mathbf{a}_N - \sum_{j=1}^{N-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На основе каждого вектора &amp;lt;math&amp;gt;\mathbf{b}_j (j = 1 \cdots N)&amp;lt;/math&amp;gt; может быть получен нормированный вектор &amp;lt;math&amp;gt;\mathbf{e}_j = \frac{\mathbf{b}_j}{||\mathbf{b}_j||}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результаты процесса ортогонализации Грама-Шмидта: &amp;lt;math&amp;gt;\mathbf{b}_1\cdots\mathbf{b}_N&amp;lt;/math&amp;gt; - система ортогональных векторов либо система ортонормированных векторов &amp;lt;math&amp;gt;\mathbf{e}_1\cdots\mathbf{e}_N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подробное описание можно найти в &amp;lt;ref&amp;gt;А.Н. Канатников, А.П.Крищенко, Линейная Алгебра&amp;lt;/ref&amp;gt; &amp;lt;ref&amp;gt;The University of Southern Mississippi, Department of Mathematics, Jim Lambers, Gram-Schmidt Orthogonalization&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Основная вычислительная сложность данного алгоритма заключается в вычислении суммы проекций векторов &amp;lt;math&amp;gt;\sum_{j=1}^{i-1} \mathbf{proj}_{\mathbf{b}_j} \mathbf{a}_N&amp;lt;/math&amp;gt; для каждого &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подробное описание общей сложности алгоритма представлено в разделе [[#Последовательная сложность алгоритма]]&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;{a_1, a_2, \cdots , a_N}&amp;lt;/math&amp;gt;. Тогда:&lt;br /&gt;
&lt;br /&gt;
Шаг 1: &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;\mathbf{b}_i &amp;lt;/math&amp;gt; следует последовательно выполнять Шаг 2 для всех &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; таких что при &amp;lt;math&amp;gt; 2 \le i \le N &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Шаг 2: &amp;lt;math&amp;gt;\mathbf{b}_i = \mathbf{a}_i - \sum_{j=1}^{i-1} \mathbf{proj}_{\mathbf{b}_{j}} \mathbf{a}_i&amp;lt;/math&amp;gt;, где для каждого &amp;lt;math&amp;gt;\mathbf{proj}_b a&amp;lt;/math&amp;gt; выполняется &amp;lt;math&amp;gt;\frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle}b&amp;lt;/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;{\color{Blue}\bullet} \quad M \cdot 3&amp;lt;/math&amp;gt; - умножений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad (M-1) \cdot 2&amp;lt;/math&amp;gt; - сложений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad 1 &amp;lt;/math&amp;gt; - деление;&lt;br /&gt;
&lt;br /&gt;
Общее число операций, необходимых для вычисления алгоритма следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad \frac{N(N-1)}{2} \cdot M \cdot 3&amp;lt;/math&amp;gt; - умножений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad \frac{N(N-1)}{2} \cdot (M-1) \cdot 3 &amp;lt;/math&amp;gt; - сложений и вычитаний;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad \frac{N(N-1)}{2} &amp;lt;/math&amp;gt; - делений.&lt;br /&gt;
&lt;br /&gt;
Исходя из вышесказанного, получаем итоговую сложность последовательного алгоритма &amp;lt;math&amp;gt;O(N^2 \cdot M)&amp;lt;/math&amp;gt;.&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;b_i&amp;lt;/math&amp;gt; требуется найти &amp;lt;math&amp;gt;proj_{b_{j}}a_{i}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;j \in [1, i]&amp;lt;/math&amp;gt;. Следовательно для полного вычисления вектора &amp;lt;math&amp;gt;b_{i}&amp;lt;/math&amp;gt; требуется знать все &amp;lt;math&amp;gt;b_{j}&amp;lt;/math&amp;gt; с меньшим индексом. Такая зависимость по данным очень не удачна для параллелизма. Однако, если разбить процесс вычисления &amp;lt;math&amp;gt;b_{i}&amp;lt;/math&amp;gt; на несколько этапов, соответствующих функциям проекции (&amp;lt;math&amp;gt;proj_{b_{j}}a_{i}&amp;lt;/math&amp;gt;), то это позволит производить некоторые предварительные вычисления для &amp;lt;math&amp;gt;b_{j}&amp;lt;/math&amp;gt; до момента, когда станут известны все предшествующие ей &amp;lt;math&amp;gt;b_{i}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На Рис. 1 изображена зависимость каждого из этапов от предыдущих вычислений. Первая строка овалов содержит все проекции, зависящие от &amp;lt;math&amp;gt;b_{1}&amp;lt;/math&amp;gt;, вторая строка - все проекции, зависящие от &amp;lt;math&amp;gt;b_{2}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\;\cdots\;&amp;lt;/math&amp;gt;, самая верхняя строка содержит проекцию, которая зависит от &amp;lt;math&amp;gt;b_{N-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рис. 2 показывает зависимость по данным немного в другом формате. Каждая строка представляет собой набор данных, которые требуются для вычисления &amp;lt;math&amp;gt;b_{i}&amp;lt;/math&amp;gt; из первого столбца. Второй и последующие столбцы группируют проекции, зависящие от одной из &amp;lt;math&amp;gt;b_{i}&amp;lt;/math&amp;gt; и, с помощью стрелки, показывают эту зависимость. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Diagram_Gram-Schmidt_DataFlow.png|center|frame|Рис. 1. Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
[[Файл:Diagram_Gram-Schmidt_DataFlow_1.png|center|frame|Рис. 2. Информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
=== Уточнение информационного графа ===&lt;br /&gt;
В этом разделе будет представлено уточнение информационной структуры графа изображенного на Рис. 1 с помощью раскрытия внутренней структуры операции проекции. Полученный граф несёт в себе новую информацию, которую можно использовать для улучшения алгоритма, но становится менее понятным.&lt;br /&gt;
&lt;br /&gt;
На Рис. 3 изображен граф, аналогичный графу Рис. 1, но функция &amp;lt;math&amp;gt;proj&amp;lt;/math&amp;gt; изображена более подробно. Оранжевым овалом обозначаются скалярные произведения двух векторов. Голубой треугольник - принимает на вход два числа (являющиеся результатами скалярных произведений) и вычисляет их частное. Зелёным шестиугольником обозначается произведение вектора &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt; на число. Фиолетовый ромб складывает два числа, от которых имеется зависимость.&lt;br /&gt;
&lt;br /&gt;
По сравнению с Рис. 1, более детальное описание информационной модели позволяет заметить повторяющиеся построчно скалярные произведения &amp;lt;math&amp;gt;(b_i, b_i)&amp;lt;/math&amp;gt;. Это замечание позволяет уменьшить суммарное число операций, но увеличивает связность графа. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Diagram_Gram-Schmidt_DataFlow_proj.png|center|frame|Рис. 3. Уточненный информационный граф алгоритма Грама-Шмидта]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На основе графа зависимости по данным, представленном на Рис. 1 или Рис. 2 раздела [[#Информационный граф]] можно выделить следующий ресурс для параллелизации. После вычисления &amp;lt;math&amp;gt;b_{i}&amp;lt;/math&amp;gt; можно начинать параллельно вычислять все &amp;lt;math&amp;gt;proj_{b_i}a_{j}&amp;lt;/math&amp;gt;. На Рис. 2 блоки, которые можно вычислять параллельно представлены столбцами.&lt;br /&gt;
&lt;br /&gt;
Кроме того, при очень больших размерностях можно также распараллелить вычисление проекций. Так как в функции проекции участвует пара векторов &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, а сама операция проекции определяется как &amp;lt;math&amp;gt;\mathbf{proj}_b a = \frac{\left \langle a,b \right \rangle}{\left \langle b,b \right \rangle }b&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\left \langle a,b \right \rangle&amp;lt;/math&amp;gt; - скалярное произведение векторов &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, то с помощью использования векторных операций можно получить некоторый выигрыш в производительности.&lt;br /&gt;
&lt;br /&gt;
=== Оценка ускорения параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим случай, когда присутствует возможность запуска бесконечного числа потоков. Попробуем оценить сложность вычисления ортогональных векторов, при условии, что параллельно будут запускаться все проекции использующие одинаковую &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt;. В этом случае, останется [[критический путь]] зависимости по данным: &amp;lt;math&amp;gt;b_1 \leftarrow proj_{b_2}a_{2} \leftarrow b_2 \leftarrow proj_{b_3}a_{3} \leftarrow \ldots \leftarrow proj_{b_{N-1}}a_{N-1} \leftarrow b_N&amp;lt;/math&amp;gt;. Следовательно для оценки сложность распараллеленной версии алгоритма достаточно почитать сложность представленной цепочки вычислений.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad M \cdot 3&amp;lt;/math&amp;gt; умножения в одной проекции;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad (M-1) \cdot 2&amp;lt;/math&amp;gt; сложения;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad 1&amp;lt;/math&amp;gt; деление;&lt;br /&gt;
&lt;br /&gt;
В цепочке зависимости данных присутствует &amp;lt;math&amp;gt;N-1&amp;lt;/math&amp;gt; проекция, значит всего:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad N \cdot M \cdot 3&amp;lt;/math&amp;gt; - умножений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad N \cdot (M-1) \cdot 2&amp;lt;/math&amp;gt; - сложений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad N \cdot 1&amp;lt;/math&amp;gt; - делений.&lt;br /&gt;
&lt;br /&gt;
Получаем итоговую сложность &amp;lt;math&amp;gt;O(N \cdot M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если дополнительно рассматривать возможность параллелизации векторных операций (скалярного произведения и умножения вектора на число), [[критический путь]] можно сократить до следующих операций:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad 3 \cdot N &amp;lt;/math&amp;gt; умножений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad N &amp;lt;/math&amp;gt; делений;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad N \cdot logM &amp;lt;/math&amp;gt; сложений;&lt;br /&gt;
&lt;br /&gt;
Следовательно оценка сложности параллельного алгоритма станет равна &amp;lt;math&amp;gt;O(N \cdot logM)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
Входные данные: прямоугольная матрица &amp;lt;math&amp;gt;A^{M \times N}&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\mathbf{a}_{ij}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Ограничение: матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; должна быть невырожденной.&lt;br /&gt;
&lt;br /&gt;
Объём входных данных: &amp;lt;math&amp;gt; N \cdot N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (система ортогональных векторов &amp;lt;math&amp;gt;\mathbf{b}_{1} \cdots \mathbf{b}_{N}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Объём выходных данных: &amp;lt;math&amp;gt;N \cdot N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов : &amp;lt;math&amp;gt;\frac{N^2 \cdot M}{N \cdot log M} = \frac{N \cdot M}{log M}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отношение числа операций к суммарному объему входных и выходных данных - линейное.&lt;br /&gt;
&lt;br /&gt;
Существуют несколько реализаций рассматриваемого алгоритма. Статья &amp;lt;ref&amp;gt;Å. Björck, Numerics of Gram-Schmidt orthogonalization.&amp;lt;/ref&amp;gt; описывает три версии данного алгоритма: строковый классический алгоритм Г-Ш (Грама - Шмидта), столбцовый классический алгоритм Г-Ш&amp;lt;ref&amp;gt;Massachusetts Institute of Technology, Per-Olof Persson, Introduction to Numerical Methods: Gram-Schmidt Orthogonalization&amp;lt;/ref&amp;gt; и модифицированный алгоритм Г-Ш. Модифицированный алгоритм Грама-Шмидта&amp;lt;ref&amp;gt;С.А. Белов, Н.Ю. Золотых, Численные Методы Линейной Алгебры&amp;lt;/ref&amp;gt; является вычислительно более устойчивым &amp;lt;ref&amp;gt;Massachusetts Institute of Technology, Per-Olof Persson, Introduction to Numerical Methods: Gram-Schmidt Orthogonalization&amp;lt;/ref&amp;gt;, то есть позволяет уменьшить погрешность вычислений связанную с ошибкой выполнения операций с плавающей точкой.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама — Шмидта может применяться к линейно зависимым векторам. В этом случае он выдаёт &amp;lt;math&amp;gt; 0 &amp;lt;/math&amp;gt;  (нулевой вектор) на шаге &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;a_{j}&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;a_{1}, \ldots ,a_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
TODO: (до 15 ноября)&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Пример реализации базового алгоритма на языке Си с использованием технологий OpenMP и MPI представлен в статье &amp;lt;ref&amp;gt;Tirana University, Department of Mathematics, Genci Berati, Gram–Schmidt Process in Different Parallel Platforms (Control Flow versus Data Flow)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Во всех библиотеках предназначенных для математических вычислений реализованы алгоритмы ортогонализации. В наиболее популярных:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad &amp;lt;/math&amp;gt; Mathematica - Orthogonalize[{v1,v2,…}] [https://reference.wolfram.com/language/tutorial/VectorOperations.html]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad &amp;lt;/math&amp;gt; Maxima - gramschmidt(x) [http://maxima.sourceforge.net/docs/manual/maxima_23.html]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad &amp;lt;/math&amp;gt; MatLab - orth(A) [https://www.mathworks.com/help/symbolic/orth.html]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;{\color{Blue}\bullet} \quad &amp;lt;/math&amp;gt; SciPy - scipy.linalg.orth(A) [http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.linalg.orth.html] - Ортогонализация с использованием алгоритма SVD.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:DVIN/%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%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14000</id>
		<title>Участник:DVIN/Ортогонализация Грамма-Шмидта</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:DVIN/%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%BC%D0%B0-%D0%A8%D0%BC%D0%B8%D0%B4%D1%82%D0%B0&amp;diff=14000"/>
		<updated>2016-10-26T13:27:36Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{algorithm&lt;br /&gt;
| name              = Ортогонализация Грама-Шмидта&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[Участник:DVIN|Инжелевская Дарья Валерьевна]]&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритмов ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Создатели алгоритма Эрхард Шмидт и Йорген Педерсен Грам.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Эрхард Шмидт&#039;&#039;&#039; (14 января 1876 — 6 декабря 1959) — немецкий математик, с 1917 года профессор Берлинского университета. В 1946—58 первый директор Института математики АН ГДР. Основные труды по теории функций, интегральным уравнениям, функциональному анализу. Определил и изучил геометрически гильбертово пространство, используя аналогии с геометрией Евклида. Занимался квадратичными формами. Известен оператор Гильберта-Шмидта и процесс Грама ― Шмидта.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Йорген Педерсен Грам&#039;&#039;&#039; (27 июня 1850 - 29 апреля 1916) датский математик, родился в герцогстве Шлезвиг, Дания и умер в Копенгагене, Дания. Основные его работы &amp;quot;On series expansions determined by the methods of least squares&amp;quot;, &amp;quot;Investigations of the number of primes less than a given number&amp;quot;. Математический метод, который носит его имя, процесс Грама-Шмидта, впервые был опубликован в 1883. Теорема Грама и Определитель Грама также назван в его честь.&lt;br /&gt;
&lt;br /&gt;
Процесс Грама-Шмидта — это один из алгоритмов, в которых на основе счётного множества линейно независимых векторов &amp;lt;math&amp;gt;{\displaystyle \mathbf {a} _{1},\;\ldots ,\;\mathbf {a} _{N}}&amp;lt;/math&amp;gt; строится множество ортогональных векторов &amp;lt;math&amp;gt;{\displaystyle \mathbf {b}_{1},\;\ldots ,\;\mathbf {b} _{N}} &amp;lt;/math&amp;gt; или ортонормированных векторов &amp;lt;math&amp;gt;{\displaystyle \mathbf {e} _{1},\;\ldots ,\;\mathbf {e}_{N}} &amp;lt;/math&amp;gt;, причём так, что каждый вектор &amp;lt;math&amp;gt;{\displaystyle \mathbf {b} _{j}} &amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;{\displaystyle \mathbf {e} _{j}}&amp;lt;/math&amp;gt; может быть выражен линейной комбинацией векторов &amp;lt;math&amp;gt;{\displaystyle \mathbf {a} _{1},\;\ldots ,\; \mathbf {a} _{j}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
==== Классический процесс Грама — Шмидта ====&lt;br /&gt;
&lt;br /&gt;
===== Алгоритм =====&lt;br /&gt;
Пусть имеются линейно независимые векторы &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим оператор проекции следующим образом: &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}}\,\mathbf{a} = {\langle \mathbf{a}, \mathbf{b} \rangle \over \langle \mathbf{b}, \mathbf{b}\rangle} \mathbf{b} ,&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;\langle \mathbf{a}, \mathbf{b} \rangle&amp;lt;/math&amp;gt; — скалярное произведение векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Скалярное произведение для двух векторов  &amp;lt;math&amp;gt;\mathbf{ a= [a_1, a_2, ...,a_k]}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{ b= [b_1, b_2, ..., b_k]}&amp;lt;/math&amp;gt;  в &#039;&#039;&#039;&#039;&#039;k&#039;&#039;&#039;&#039;&#039;-мерном действительном пространстве определяется как:&lt;br /&gt;
:&amp;lt;math&amp;gt;\mathbf{a}\cdot\mathbf{b}=\sum_{i=1}^k a_ib_i=a_1b_1+a_2b_2+\cdots+ a_kb_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Этот оператор проецирует вектор &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; коллинеарно вектору &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ортогональность векторов &amp;lt;math&amp;gt;\mathbf{a}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}&amp;lt;/math&amp;gt; достигается на шаге (2).&lt;br /&gt;
&lt;br /&gt;
Классический процесс Грама — Шмидта выполняется следующим образом:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
{\begin{array}{lclr}&lt;br /&gt;
{\mathbf  {b}}_{1}&amp;amp;=&amp;amp;{\mathbf  {a}}_{1}&amp;amp;(1)\\&lt;br /&gt;
{\mathbf  {b}}_{2}&amp;amp;=&amp;amp;{\mathbf  {a}}_{2}-{\mathbf  {proj}}_{{{\mathbf  {b}}_{1}}}\,{\mathbf  {a}}_{2}&amp;amp;(2)\\&lt;br /&gt;
{\mathbf  {b}}_{3}&amp;amp;=&amp;amp;{\mathbf  {a}}_{3}-{\mathbf  {proj}}_{{{\mathbf  {b}}_{1}}}\,{\mathbf  {a}}_{3}-{\mathbf  {proj}}_{{{\mathbf  {b}}_{2}}}\,{\mathbf  {a}}_{3}&amp;amp;(3)\\&lt;br /&gt;
{\mathbf  {b}}_{4}&amp;amp;=&amp;amp;{\mathbf  {a}}_{4}-{\mathbf  {proj}}_{{{\mathbf  {b}}_{1}}}\,{\mathbf  {a}}_{4}-{\mathbf  {proj}}_{{{\mathbf  {b}}_{2}}}\,{\mathbf  {a}}_{4}-{\mathbf  {proj}}_{{{\mathbf  {b}}_{3}}}\,{\mathbf  {a}}_{4}&amp;amp;(4)\\&lt;br /&gt;
&amp;amp;\vdots &amp;amp;&amp;amp;\\{\mathbf  {b}}_{N}&amp;amp;=&amp;amp;{\mathbf  {a}}_{N}-\displaystyle \sum _{{j=1}}^{{N-1}}{\mathbf  {proj}}_{{{\mathbf  {b}}_{j}}}\,{\mathbf  {a}}_{N}&amp;amp;(N)&lt;br /&gt;
\end{array}}&lt;br /&gt;
 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На основе каждого вектора &amp;lt;math&amp;gt;\mathbf{b}_j \;(j = 1 \ldots N)&amp;lt;/math&amp;gt; может быть получен нормированный вектор: &amp;lt;math&amp;gt;\mathbf{e}_j = {\mathbf{b}_j\over \| \mathbf{b}_j \|}&amp;lt;/math&amp;gt; (у нормированного вектора направление будет таким же, как у исходного, а длина — единичной).&lt;br /&gt;
&lt;br /&gt;
Результаты процесса Грама — Шмидта:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{b}_1,\;\ldots,\;\mathbf{b}_N&amp;lt;/math&amp;gt; — система ортогональных векторов либо&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf{e}_1,\;\ldots,\;\mathbf{e}_N&amp;lt;/math&amp;gt; — система ортонормированных векторов.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;\mathbf{b}_1,\;\ldots,\;\mathbf{b}_N&amp;lt;/math&amp;gt; носит название ортогонализации Грама — Шмидта, а &amp;lt;math&amp;gt;\mathbf{e}_1,\;\ldots,\;\mathbf{e}_N&amp;lt;/math&amp;gt; — ортонормализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
===== Доказательство =====&lt;br /&gt;
Докажем ортогональность векторов &amp;lt;math&amp;gt;\mathbf{b}_1,\;\ldots,\;\mathbf{b}_N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для этого вычислим скалярное произведение &amp;lt;math&amp;gt;\langle \mathbf{b}_1, \mathbf{b}_2 \rangle&amp;lt;/math&amp;gt;, подставив в него формулу (2). Мы получим ноль. Равенство нулю скалярного произведения векторов означает, что эти векторы ортогональны. Затем вычислим скалярное произведение &amp;lt;math&amp;gt;\langle \mathbf{b}_1, \mathbf{b}_3 \rangle&amp;lt;/math&amp;gt;, используя результат для &amp;lt;math&amp;gt;\langle \mathbf{b}_1, \mathbf{b}_2 \rangle&amp;lt;/math&amp;gt; и формулу (3). Мы снова получим ноль, то есть векторы &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}_3&amp;lt;/math&amp;gt; ортогональны. Общее доказательство выполняется методом математической индукции.&lt;br /&gt;
&lt;br /&gt;
===== Геометрическая интерпретация — вариант 1 =====&lt;br /&gt;
[[Файл:Gram-Schmidt-step2.svg|right|frame|Рис. 1. Второй шаг процесса Грама — Шмидта]]&lt;br /&gt;
Рассмотрим формулу (2) — второй шаг алгоритма.&lt;br /&gt;
Её геометрическое представление изображено на рис. 1:&lt;br /&gt;
&lt;br /&gt;
1 — получение проекции вектора &amp;lt;math&amp;gt;\mathbf{a}_2&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2 — вычисление &amp;lt;math&amp;gt;\mathbf{a}_2-\mathbf{proj}_{\mathbf{b}_1}\mathbf{a}_2&amp;lt;/math&amp;gt;, то есть [[перпендикуляр]]а, которым выполняется проецирование конца &amp;lt;math&amp;gt;\mathbf{a}_2&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Этот перпендикуляр — вычисляемый в формуле (2) вектор &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3 — перемещение полученного на шаге 2 вектора &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt; в начало координат. Это перемещение сделано на рисунке лишь для наглядности. Оно не является математическим действием и поэтому не отражается в формуле (2).&lt;br /&gt;
&lt;br /&gt;
На рисунке видно, что вектор &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt; ортогонален вектору &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt;, так как &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt; является перпендикуляром, по которому &amp;lt;math&amp;gt;\mathbf{a}_2&amp;lt;/math&amp;gt; проецируется на &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим формулу (3) — третий шаг алгоритма — в следующем варианте:&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcr}&lt;br /&gt;
\mathbf{b}_3 = \mathbf{a}_3-(\mathbf{proj}_{\mathbf{b}_1}\mathbf{a}_3+\mathbf{proj}_{\mathbf{b}_2}\mathbf{a}_3) &amp;amp; &amp;amp; (6) \\&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Её геометрическое представление изображено на рис. 2:&lt;br /&gt;
[[Файл:Gram-schmidt-step3base1.png|center|frame|Рис. 2. Третий шаг процесса Грама — Шмидта]]&lt;br /&gt;
&lt;br /&gt;
1 — получение проекции вектора &amp;lt;math&amp;gt;\mathbf{a}_3&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2 — получение проекции вектора &amp;lt;math&amp;gt;\mathbf{a}_3&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
3 — вычисление суммы &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b}_1}\mathbf{a}_3 + \mathbf{proj}_{\mathbf{b}_2}\mathbf{a}_3&amp;lt;/math&amp;gt;, то есть проекции вектора &amp;lt;math&amp;gt;\mathbf{a}_3&amp;lt;/math&amp;gt; на плоскость, образуемую векторами &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt;. Эта плоскость закрашена на рисунке серым цветом;&lt;br /&gt;
&lt;br /&gt;
4 — вычисление &amp;lt;math&amp;gt;\mathbf{a}_3-(\mathbf{proj}_{\mathbf{b}_1}\mathbf{a}_3 + \mathbf{proj}_{\mathbf{b}_2}\mathbf{a}_3)&amp;lt;/math&amp;gt;, то есть перпендикуляра, которым выполняется проецирование конца &amp;lt;math&amp;gt;\mathbf{a}_3&amp;lt;/math&amp;gt; на плоскость, образуемую векторами &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt;. Этот перпендикуляр — вычисляемый в формуле (6) вектор &amp;lt;math&amp;gt;\mathbf{b}_3&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
5 — перемещение полученного &amp;lt;math&amp;gt;\mathbf{b}_3&amp;lt;/math&amp;gt; в начало координат. Это перемещение сделано на рисунке лишь для наглядности. Оно не является математическим действием и поэтому не отражается в формуле (6).&lt;br /&gt;
&lt;br /&gt;
На рисунке видно, что вектор &amp;lt;math&amp;gt;\mathbf{b}_3&amp;lt;/math&amp;gt; ортогонален векторам &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt;, так как &amp;lt;math&amp;gt;\mathbf{b}_3&amp;lt;/math&amp;gt; является перпендикуляром, по которому &amp;lt;math&amp;gt;\mathbf{a}_3&amp;lt;/math&amp;gt; проецируется на плоскость, образуемую векторами &amp;lt;math&amp;gt;\mathbf{b}_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mathbf{b}_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, в процессе Грама — Шмидта для вычисления &amp;lt;math&amp;gt;\mathbf{b}_j&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}_1,\;\ldots,\;\mathbf{b}_{j-1}&amp;lt;/math&amp;gt;. Вектор &amp;lt;math&amp;gt;\mathbf{b}_j&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; — это перпендикуляр? от конца &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; к гиперплоскости?, формируемой векторами &amp;lt;math&amp;gt;\mathbf{b}_1,\;\ldots,\;\mathbf{b}_{j-1}&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;
При вычислении на ЭВМ по формулам (1) — (5) векторы &amp;lt;math&amp;gt;\mathbf{b}_1,\;\ldots,\;\mathbf{b}_{N-1}&amp;lt;/math&amp;gt; часто не точно ортогональны из-за [[Ошибка квантования|ошибок округления]]. Из-за потери ортогональности в процессе вычислений классический процесс Грама — Шмидта называют [[Численная устойчивость|численно неустойчивым]].&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный процесс Грама — Шмидта ====&lt;br /&gt;
Процесс Грама — Шмидта может быть сделан более вычислительно устойчивым путём небольшой модификации. Вместо вычисления &amp;lt;math&amp;gt;\mathbf{b}_j&amp;lt;/math&amp;gt; как: &amp;lt;math&amp;gt; \mathbf{b}_j = \mathbf{a}_j - \mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j - \mathbf{proj}_{\mathbf{b}_2}\,\mathbf{a}_j - \ldots - \mathbf{proj}_{\mathbf{b}_{j-1}}\,\mathbf{a}_j  \; (7) &amp;lt;/math&amp;gt; этот вектор вычисляется следующим образом:&lt;br /&gt;
: &amp;lt;math&amp;gt; \begin{array}{lclr}&lt;br /&gt;
\mathbf{a}_j^{(1)} &amp;amp; = &amp;amp;\mathbf{a}_j - \mathbf{proj}_{\mathbf{b}_1}\,\mathbf{a}_j &amp;amp; (8) \\&lt;br /&gt;
\mathbf{a}_j^{(2)} &amp;amp; = &amp;amp;\mathbf{a}_j^{(1)} - \mathbf{proj}_{\mathbf{b}_2} \, \mathbf{a}_j^{(1)} &amp;amp; (9) \\&amp;amp; \vdots &amp;amp; &amp;amp; \\&lt;br /&gt;
\mathbf{a}_j^{(j-2)} &amp;amp; = &amp;amp; \mathbf{a}_j^{(j-3)} - \mathbf{proj}_{\mathbf{b}_{j-2}} \, \mathbf{a}_j^{(j-3)} &amp;amp; (10) \\&lt;br /&gt;
\mathbf{b}_j &amp;amp; = &amp;amp; \mathbf{a}_j^{(j-2)} - \mathbf{proj}_{\mathbf{b}_{j-1}} \, \mathbf{a}_j^{(j-2)} &amp;amp; (11)&lt;br /&gt;
\end{array} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Вычислительное ядро&#039;&#039;&#039; (computational kernel) алгоритма - это часть алгоритма, на которую приходится основное время его работы.&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода ортогонализации Грамма-Шмидта можно составить из множественных (всего их &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt;) вычислений проекций : &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b_j}}\,\mathbf{a_i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Данный алгоритм использует в качестве составных частей другие алгоритмы. В дальнейшем имеет смысл описывать алгоритм не в максимально детализированном виде (т.е. на уровне арифметических операций), а давать только его макроструктуру, то есть описывает структуру и состав макроопераций. Типичной макрооперацией, часто встречающиеся в алгоритме является оператор проекции векторов. Как записано и в описании ядра алгоритма, основную часть метода ортогонализации Грамма-Шмидта составляют множественные (всего их &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt;) вычисления оператора проекции.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Следующий алгоритм реализует нормализацию Грамма-Шмидта. Векторы &amp;lt;math&amp;gt;v_1,...,v_k&amp;lt;/math&amp;gt; заменяются набором ортонормированных векторов, которые имеют ту же линейную оболочку.&lt;br /&gt;
[[File:Gram-Schmidt ortho.png|none|thumb]]&lt;br /&gt;
&lt;br /&gt;
Вычислительная сложность этого &amp;lt;math&amp;gt;2Nk^2&amp;lt;/math&amp;gt; операции с плавающей точкой, где N - размерность векторов.&lt;br /&gt;
&lt;br /&gt;
Последовательность исполнения метода следующая:&lt;br /&gt;
&lt;br /&gt;
1. &amp;lt;math&amp;gt;\mathbf  {b}_{1}=\mathbf  {a}_{1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Далее для всех векторов &amp;lt;math&amp;gt;\mathbf  {b}_{i}&amp;lt;/math&amp;gt; для &amp;lt;math&amp;gt;i=2 ... N&amp;lt;/math&amp;gt; производим вычисление по следующей формуле:&lt;br /&gt;
&amp;lt;math&amp;gt;{\mathbf  {b}}_{i}={\mathbf  {a}}_{i}-\displaystyle \sum _{{j=1}}^{{i-1}}{\mathbf  {proj}}_{{{\mathbf  {b}}_{j}}}\,{\mathbf  {a}}_{i}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В ней на каждом шаге &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; по очереди вычисляются все &amp;lt;math&amp;gt;{\mathbf  {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;&lt;br /&gt;
&lt;br /&gt;
Пример реализации на Python. Функция работает для произвольного количества векторов любой размерности. При этом если количество векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_N&amp;lt;/math&amp;gt; больше их размерности или они линейно зависимы то функция возвращает максимально возможное число линейно независимых векторов &amp;lt;math&amp;gt;\mathbf{b}_1,\;\ldots,\;\mathbf{b}_n&amp;lt;/math&amp;gt;, а остальные векторы &amp;lt;math&amp;gt;\mathbf{b}_{n+1},\;\ldots,\;\mathbf{b}_N&amp;lt;/math&amp;gt; нулевые.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
def GramSchmidt(*a):&lt;br /&gt;
    k=len(a[0])&lt;br /&gt;
    N=len(a);&lt;br /&gt;
    b = [[0] * k for i in range(N)]&lt;br /&gt;
    b[0]=a[0]&lt;br /&gt;
    for i in range(1,N):&lt;br /&gt;
        sum=a[i]&lt;br /&gt;
        for j in range(0,i):&lt;br /&gt;
            scolar_ab=0&lt;br /&gt;
            scolar_bb=0&lt;br /&gt;
            proj=[i for i in range(k)]&lt;br /&gt;
            for n in range(k):&lt;br /&gt;
                scolar_ab+=b[j][n]*a[i][n]&lt;br /&gt;
                scolar_bb+=b[j][n]*b[j][n]&lt;br /&gt;
            for n in range(k):&lt;br /&gt;
                proj[n]=(scolar_ab/scolar_bb)*b[j][n]&lt;br /&gt;
            for n in range(k):&lt;br /&gt;
                sum[n]-=proj[n]&lt;br /&gt;
        b[i]=sum&lt;br /&gt;
    return b;&lt;br /&gt;
&lt;br /&gt;
l1=[random.randrange(0,10) for i in range(3)]&lt;br /&gt;
l2=[random.randrange(0,10) for i in range(3)]&lt;br /&gt;
l3=[random.randrange(0,10) for i in range(3)]&lt;br /&gt;
print(l1,l2,l3)&lt;br /&gt;
print(GramSchmidt(l1,l2,l3))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортогонального набора векторов в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
При k=N:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{N(N-1)(3N-1)}{2}&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{3N^2 (N-1)}{2}&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
При k≠N&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; делений,&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{N(N-1)(3k-1)}{2}&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\frac{3Nk (N-1)}{2}&amp;lt;/math&amp;gt; умножений.&lt;br /&gt;
&lt;br /&gt;
При классификации по последовательной сложности, таким образом, ортогонализация Грамма-Шмидта относится к алгоритмам с кубической сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
Опишем граф алгоритма как аналитически, так и в виде рисунка.&lt;br /&gt;
&lt;br /&gt;
Граф алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двух областей.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Первая&#039;&#039;&#039; группа вершин расположена в двумерной области, соответствующая ей операция &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b_j}}\,\mathbf{a_i} = {\langle \mathbf{a_i}, \mathbf{b_j} \rangle \over \langle \mathbf{b_j}, \mathbf{b_j}\rangle} \mathbf{b_j} ,&amp;lt;/math&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы:&lt;br /&gt;
&lt;br /&gt;
i — меняется в диапазоне от 2 до N, принимая все целочисленные значения;&lt;br /&gt;
&lt;br /&gt;
j — меняется в диапазоне от 1 до i-1, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;:&lt;br /&gt;
элементы входных данных, а именно &amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt;: &lt;br /&gt;
результат срабатывания операции, соответствующей вершине из второй группы, с координатой j.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вторая&#039;&#039;&#039; группа вершин расположена в двухмерной области, соответствующая ей операция  &amp;lt;math&amp;gt;a - b&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Естественно введённые координаты области таковы: &lt;br /&gt;
&lt;br /&gt;
i — меняется в диапазоне от 2 до N, принимая все целочисленные значения;&lt;br /&gt;
&lt;br /&gt;
j — меняется в диапазоне от 1 до i-1, принимая все целочисленные значения.&lt;br /&gt;
&lt;br /&gt;
Аргументы операции следующие:&lt;br /&gt;
&lt;br /&gt;
a:&lt;br /&gt;
&lt;br /&gt;
j=1 - входные данные &amp;lt;math&amp;gt;a_j&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
j&amp;gt;1 - результат срабатывания операции, соответствующей вершине из второй группы, с координатой j-1&lt;br /&gt;
&lt;br /&gt;
b: &lt;br /&gt;
&lt;br /&gt;
результат срабатывания операции, соответствующей вершине из первой группы, с координатой j&lt;br /&gt;
[[Файл:picture00001.jpg|мини|upright=2|centre|frame|Рис. 5. Граф алгоритма с отображением входных и выходных данных. Proj - вычисление оператора проекции, F - операция a-b, In - входные данные, Out - результаты.]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В параллельном варианте, в отличие от последовательного, вычисления  &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b_j}}\,\mathbf{a_i}&amp;lt;/math&amp;gt;  можно выполнять параллельно. То есть после каждого вычисления &amp;lt;math&amp;gt;b_j&amp;lt;/math&amp;gt; можно запускать параллельное вычисление &amp;lt;math&amp;gt;\mathbf{proj}_{\mathbf{b_j}}\,\mathbf{a_i}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i=j+1..N&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации в параллельном варианте требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
* &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; ярусов в каждом из которых будет выполнятся,&lt;br /&gt;
* по &amp;lt;math&amp;gt;N - 1&amp;lt;/math&amp;gt; операторов проекций (в каждом из ярусов линейное количество проекций, в зависимости от яруса — от &amp;lt;math&amp;gt;N-1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;),&lt;br /&gt;
* по &amp;lt;math&amp;gt;N - 1&amp;lt;/math&amp;gt; сложений (в каждом из ярусов линейное количество сложений, в зависимости от яруса — от &amp;lt;math&amp;gt;N-1&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;),&lt;br /&gt;
&lt;br /&gt;
При классификации по высоте (количество ярусов в ЯПФ ) ЯПФ, таким образом, ортогонализация Грамма-Шмидта относится к алгоритмам со сложностью &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
При классификации по ширине (максимальное количество вершин в ярусе) ЯПФ его сложность будет &amp;lt;math&amp;gt;O(N^2)&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;{\displaystyle \mathbf {a} _{1},\;\ldots ,\;\mathbf {a} _{N}}&amp;lt;/math&amp;gt;, каждый из которых описывается &amp;lt;math&amp;gt;\mathbf{ a_i= [a^i_1, a^i_2, ..., a^i_k]}&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Дополнительные ограничения:&lt;br /&gt;
* вектора &amp;lt;math&amp;gt;{\displaystyle \mathbf {a} _{1},\;\ldots ,\;\mathbf {a} _{N}}&amp;lt;/math&amp;gt; линейно независимы, поэтому &amp;lt;math&amp;gt;k \geqslant N&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Nk&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: множество ортогональных векторов &amp;lt;math&amp;gt;{\displaystyle \mathbf {b} _{1},\;\ldots ,\;\mathbf {b} _{N}} &amp;lt;/math&amp;gt;, каждый из которых описывается &amp;lt;math&amp;gt;\mathbf{ b_i= [b^i_1, b^i_2, ..., b^i_k]}&amp;lt;/math&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;Nk&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является линейным (отношение кубической к квадратичной).&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных, также линейна.&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;\mathbf{0}&amp;lt;/math&amp;gt; (нулевой вектор) на шаге &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;, если &amp;lt;math&amp;gt;\mathbf{a}_j&amp;lt;/math&amp;gt; является линейной комбинацией векторов &amp;lt;math&amp;gt;\mathbf{a}_1,\;\ldots,\;\mathbf{a}_{j-1}&amp;lt;/math&amp;gt;. Если это может случиться, то для сохранения ортогональности выходных векторов и для предотвращения деления на ноль при ортонормировании алгоритм должен делать проверку на нулевые векторы и отбрасывать их. Количество векторов, выдаваемых алгоритмом, будет равно размерности подпространства, порождённого векторами (т.е. количеству линейно независимых векторов, которые можно выделить среди исходных векторов).&lt;br /&gt;
&lt;br /&gt;
Процесс Грама ― Шмидта может быть истолкован как разложение невырожденной квадратной матрицы в произведение ортогональной (или унитарной матрицы в случае эрмитова пространства) и верхнетреугольной матрицы с положительными диагональными элементами ― QR-разложение, что есть частный случай разложения Ивасавы.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&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://numerics.mathdotnet.com/Matrix.html C#] &lt;br /&gt;
# [http://www.mathworks.com/help/symbolic/mupad_ref/linalg-orthog.html?searchHighlight=orthogonalization Matlab]&lt;br /&gt;
# [https://reference.wolfram.com/language/ref/Orthogonalize.html Wolfram]&lt;br /&gt;
# [http://www.nag.co.uk/numeric/Fl/manual/pdf/F05/f05aaf.pdf NAG Fortran]&lt;br /&gt;
&lt;br /&gt;
====Реализация для пакета Mathematica====&lt;br /&gt;
Данный скрипт, предназначенный для пакета Mathematica, проводит процесс ортогонализации Грама ― Шмидта над векторами, заданными в фигурных скобках последней строки. Количество векторов и их координат могут быть произвольными. В данном случае для примера взяты векторы {-2,1,0}, {-2,0,1}, {-0.5,-1,1}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&#039;mathematica&#039;&amp;gt;&lt;br /&gt;
Projection[v1_, v2_] := (v1.v2*v2)/v2.v2&lt;br /&gt;
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &amp;amp;) /@ vecs&lt;br /&gt;
GramSchmidt[mat_] := Fold[Join[#1, {#2 - MultipleProjection[#2, #1]}] &amp;amp;, {}, mat]&lt;br /&gt;
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
====Реализация для Maxima====&lt;br /&gt;
Данный скрипт, предназначенный для пакета Maxima, проводит процесс ортогонализации Грама ― Шмидта над векторами, заданными в квадратных скобках. Количество векторов и их координат могут быть произвольными. &lt;br /&gt;
&lt;br /&gt;
В данном случае для примера взяты векторы [-2,1,0], [-2,0,1], [-0.5,-1,1].&lt;br /&gt;
&amp;lt;source lang=&amp;quot;tsql&amp;quot;&amp;gt;&lt;br /&gt;
load(eigen);&lt;br /&gt;
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);&lt;br /&gt;
y: gramschmidt(x);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
====Реализация для MATLAB====&lt;br /&gt;
В MATLAB существует встроенная функция [Q,R]=qr(A) которая осуществляет ортогонализацияю Грамма-Шмидта столбцов матрицы А. При этом столбцы матрицы предполагаются линейнонезависимыми.&lt;br /&gt;
 &lt;br /&gt;
[Q, R] = qr(A) возвращает матрицы Q с ортонормированными столбцами и обратимую верхнетреугольную матрицу R,  так что  A=Q*R&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Беклемишев Д. В. Курс аналитической геометрии и линейной алгебры. — М.: Наука.&lt;br /&gt;
* Гельфанд И. М. Лекции по линейной алгебре. — 5-е. — М.: Добросвет, МЦНМО, 1998. — 319 с. — ISBN 5-7913-0015-8.&lt;br /&gt;
*Ильин В. А., Позняк Э. Г.  Линейная алгебра. 6-е изд. — М.: Физматлит, 2010. — 280 с. — ISBN 978-5-9221-0481-4.&lt;br /&gt;
*Халмош П. Конечномерные векторные пространства = Finite-Dimensional Vector Spaces. — М.: Физматгиз, 1963. — 263 с.&lt;br /&gt;
*Фаддеев Д. К. Лекции по алгебре. — 5-е. — СПб.: Лань, 2007. — 416 с.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта &#039;&#039;Процесс Грама ― Шмидта&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Sergeys79</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=13999</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=13999"/>
		<updated>2016-10-26T13:27:24Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &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| А.В.Кибанов]], Т.З.Аджиева.&lt;br /&gt;
&lt;br /&gt;
Все пункты данной статьи обсуждались и создавались совместно, доля ответственности равноправна.&lt;br /&gt;
&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; — алгоритм построения для данной линейно независимой системы векторов евклидова или эрмитова пространства &amp;lt;math&amp;gt;V&amp;lt;/math&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;
Классический процесс ортогонализации Грама–Шмидта применяется в таких совменных областях, как анализ изображений&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.&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;
&#039;&#039;&#039;Bходные данные:&#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;\left.\mathbf{a_i}\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;\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;\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{(ai,bj)}{\mathbf{\left \|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;
&#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;len(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}}{len(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;len(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}}{len(b_{i})}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Для ортогонализации &amp;lt;math&amp;gt;n&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&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;
Представим граф алгоритма с помощью текстового описания, а также с помощью изображения. &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; — пятая группа. Квадратные метки &amp;quot;In&amp;quot; и &amp;quot;out&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;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Для классического метода ортогонализации Грама–Шмидта существуют реализации в математических программных пакетах, таких как &lt;br /&gt;
:*[https://www.mathworks.com/help/matlab/ref/cgs.html Matlab], &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;
&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;
&lt;br /&gt;
&lt;br /&gt;
[[en: Gram–Schmidt Orthogonalization]]&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=13998</id>
		<title>Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией</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:Kozlov_Vladimir/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=13998"/>
		<updated>2016-10-26T13:27:04Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор — Козлов Владимир, 617 гр.&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;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Алгоритм применяется, когда матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; слишком велика, чтобы к ней можно было применять точные прямые методы вычисления собственных значений. Алгоритм &#039;&#039;&#039;метод Рэлея — Ритца&#039;&#039;&#039; поиска приближённых собственных значений и &#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;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;Q = [Q_k, Q_u]&amp;lt;/math&amp;gt; — ортонормированная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times k&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Q_u&amp;lt;/math&amp;gt; имеет размер &amp;lt;math&amp;gt;n \times n - k&amp;lt;/math&amp;gt;, то можно записать равенство&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T = Q^T A Q = [Q_k, Q_u]^T A [Q_k, Q_u] = &lt;br /&gt;
\left[ \begin{array}{cc}&lt;br /&gt;
Q_k^T A Q_k &amp;amp; Q_k^T A Q_u\\&lt;br /&gt;
Q_u^T A Q_k &amp;amp; Q_u^T A Q_u&lt;br /&gt;
\end{array} \right]&lt;br /&gt;
= \left[ \begin{array}{cc}&lt;br /&gt;
T_{k} &amp;amp; T_{ku}^T\\&lt;br /&gt;
T_{ku} &amp;amp; T_{u}&lt;br /&gt;
\end{array} \right].&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Метод Рэлея — Ритца заключается в том, что собственные значения матрицы &amp;lt;math&amp;gt;T_k = Q_k^T A Q_k&amp;lt;/math&amp;gt; объявляются приближёнными собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Такое приближение является в некотором смысле «наилучшим»: можно показать, что если &amp;lt;math&amp;gt;T_k = V \Lambda V^{-1}&amp;lt;/math&amp;gt; — спектральное разложение &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;, то пара &amp;lt;math&amp;gt;(Q_k V, \Lambda)&amp;lt;/math&amp;gt; минимизирует функционал &amp;lt;math&amp;gt;L(P_k, D) = \Vert A P_k - P_k D \Vert_2&amp;lt;/math&amp;gt;, причём &amp;lt;math&amp;gt;L(Q_k V, \Lambda) = \Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;, то есть &amp;lt;math&amp;gt;A \approx (Q_k V) \Lambda (Q_k V)^{-1}&amp;lt;/math&amp;gt;. Из этого также видно, что метод Рэлея — Ритца позволяет получать приближения для собственных векторов матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. Более того, можно показать, что собственные значения &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; отличаются от некоторых собственных значений &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не более чем на &amp;lt;math&amp;gt;\Vert T_{ku} \Vert_2&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Метод Ланцоша — это метод построения матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, при использовании которого, во-первых, матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; оказывается симметричной трёхдиагональной, во-вторых, столбцы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; вычисляются последовательно. Трёхдиагональность &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; приводит к следующим явлениям:&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; является трёхдиагональной матрицей меньшей размерности, а для трёхдиагональных матриц существуют высокоэффективные методы поиска собственных значений;&lt;br /&gt;
# матрица &amp;lt;math&amp;gt;T_{ku}&amp;lt;/math&amp;gt; имеет только один ненулевой (возможно) элемент — правый верхний, а значит, для оценки погрешности полученных собственных значений достаточно знать только этот элемент.&lt;br /&gt;
&lt;br /&gt;
В теории в методе Ланцоша для вычисления каждого следующего столбца &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt; матрицы &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; достаточно знать только &amp;lt;math&amp;gt;q_{j - 1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_{j}&amp;lt;/math&amp;gt; в силу трёхдиагональности матрицы &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;. На практике из-за ошибок округления, если не предпринимать специальных мер, набор векторов &amp;lt;math&amp;gt;q_{1}, \dots, q_{k}&amp;lt;/math&amp;gt; перестаёт быть ортогональным. Для борьбы с этим явлением на каждом шаге метода Ланцоша приходится выполнять так называемую переортогонализацию — повторно запускать процесс ортогонализации Грама — Шмидта.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Исходные данные: симметричная вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — матрица, для которой будут вычисляться собственные значения, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; — начальное приближение для метода Ланцоша.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: трёхдиагональная симметричная вещественная матрица &amp;lt;math&amp;gt;T_k = \left[ \begin{array}{cccc}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_1 &amp;amp; &amp;amp; \\&lt;br /&gt;
\beta_1 &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \beta_{k - 1}\\&lt;br /&gt;
&amp;amp; &amp;amp; \beta_{k - 1} &amp;amp; \alpha_k&lt;br /&gt;
\end{array} \right]&amp;lt;/math&amp;gt;, ортонормированный набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;T_k = [q_1, \dots, q_k]^T A [q_1, \dots, q_k]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Формулы метода:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
j = \overline{1, k}:\\&lt;br /&gt;
\quad z_j = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T A q_j = q_j^T z_j \\&lt;br /&gt;
\quad z_j&#039; = z_j - \sum_{i=1}^j (z_j^T q_i) q_i \\&lt;br /&gt;
\quad z_j&#039;&#039; = z_j&#039; - \sum_{i=1}^j (z_j&#039;^T q_i) q_i\\&lt;br /&gt;
\quad \beta_j = \Vert z_j&#039;&#039; \Vert_2\\&lt;br /&gt;
\quad q_{j+1} = z_j&#039;&#039; / \Vert z_j&#039;&#039; \Vert_2 = z_j&#039;&#039;/\beta_j&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Собственные значения и собственные векторы матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; ищутся любым прямым алгоритмом.&lt;br /&gt;
&lt;br /&gt;
Вычисление &amp;lt;math&amp;gt;z_j&#039;, z_j&#039;&#039;&amp;lt;/math&amp;gt; — это полная переортогонализация &amp;lt;math&amp;gt;z_j&amp;lt;/math&amp;gt; методом Грама — Шмидта. Двойной запуск практически гарантирует, что &amp;lt;math&amp;gt;z_j&#039;&#039;&amp;lt;/math&amp;gt; будет ортогонален &amp;lt;math&amp;gt;q_1, \dots, q_j&amp;lt;/math&amp;gt;. Заметим, что &amp;lt;math&amp;gt;\sum_{i=1}^j (z^T q_i) q_i = Q_j Q_j^T z&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_j = [q_1, \dots, q_j]&amp;lt;/math&amp;gt;, поэтому переортогонализацию можно переписать в виде &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j, z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta_j = 0&amp;lt;/math&amp;gt; для какого-либо &amp;lt;math&amp;gt;j &amp;lt; k&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;\Vert T_{ju}\Vert_2 = 0&amp;lt;/math&amp;gt;, а значит, собственные значения &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; в точности совпадают с каким-то собственными значениями &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;. В этом случае дальнейшие вычисления прекращаются и либо используется полученная &amp;lt;math&amp;gt;T_j&amp;lt;/math&amp;gt; размерности меньшей, чем &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, либо процедура запускается заново с другим начальным вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
У алгоритма построения матрицы &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt; в том виде, как он описан выше, можно выделить два ядра:&lt;br /&gt;
# умножение матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z_j = A q_j&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; умножений вещественных чисел);&lt;br /&gt;
# переортогонализация: &amp;lt;math&amp;gt;z&#039;_j = z_j - Q_j Q_j^T z_j,\; z_j&#039;&#039; = z_j&#039; - Q_j Q_j^T z_j&#039;&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;O(nk^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;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{l}&lt;br /&gt;
\mathtt{input:}\; A, b, k\\&lt;br /&gt;
q_1 = b / \Vert b \Vert_2\\&lt;br /&gt;
Q = q_1\\&lt;br /&gt;
\mathtt{for}\; j = \overline{1, k}:\\&lt;br /&gt;
\quad z = A q_j \\&lt;br /&gt;
\quad \alpha_j = q_j^T z \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right) \\&lt;br /&gt;
\quad z = z - Q \left( Q^T z \right)\\&lt;br /&gt;
\quad \beta_j = \Vert z \Vert_2\\&lt;br /&gt;
\quad \mathtt{if }\; \beta_j = 0\\&lt;br /&gt;
\quad \quad \mathtt{exit}\\&lt;br /&gt;
\quad \mathtt{end \; if}\\&lt;br /&gt;
\quad q_{j+1} =  z/\beta_j\\&lt;br /&gt;
\quad Q = [Q, q_{j + 1}]\\&lt;br /&gt;
\mathtt{end \; for}\\&lt;br /&gt;
\mathtt{output:}\; [\alpha_1, \dots, \alpha_k], [\beta_1, \dots, \beta_{k - 1}], [q_1, \dots, q_k].&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следует заметить, что очень часто в макрооперациях возникает операция вычисления суммы всех элементов массива. Её необходимо выполнять и при умножении матрицы на вектор, и при вычислении скалярного произведения, и при вычислении нормы вектора. Разные методы суммирования дают разный ресурс параллелизма. В этой работе предполагается, что везде для суммирования используется последовательный способ.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
На &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации алгоритм выполняет&lt;br /&gt;
* &amp;lt;math&amp;gt;n^2 + n + 4nj + n + n = n^2 + 3n + 4nj&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;n(n - 1) + (n - 1) + (4n - 2)j + (n - 1) = n^2 + (n - 2) + (4n - 2)j&amp;lt;/math&amp;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;(n + 3)nk + 2nk(k + 1)&amp;lt;/math&amp;gt; умножений и делений;&lt;br /&gt;
* &amp;lt;math&amp;gt;(n^2 + n - 2)k + (2n - 1)k(k + 1)&amp;lt;/math&amp;gt; сложений и вычитаний.&lt;br /&gt;
&lt;br /&gt;
Таким образом, алгоритм имеет последовательную сложность &amp;lt;math&amp;gt;O(n^2k) + O(nk^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
[[Файл:Lanczoc-full-orth-macro.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 1. Информационный граф алгоритма Ланцоша на уровне итераций с входными и выходными данными. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), nrm — вычисление еклидовой нормы вектора, / — деление вектора на число, Iter — итерации алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
[[Файл:Lanczoc-full-orth-iter.png|thumb|1000px|center|alt=Информационный граф алгоритма Ланцоша на уровне отдельных итераций|Рисунок 2. Информационный граф итерации алгоритма Ланцоша на уровне макроопераций. In — входные данные (матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;), Out — выходные данные (&amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;q_j&amp;lt;/math&amp;gt;), dprod — скалярное произведение векторов, mprod — произведение матрицы на вектор, - — разность векторов, nrm — вычисление еклидовой нормы вектора, / — деление вектора на число.]]&lt;br /&gt;
&lt;br /&gt;
Информационный граф для алгоритма умножения матрицы на вектор можно видеть [[Умножение плотной неособенной матрицы на вектор (последовательный вещественный вариант)#Информационный граф|по этой ссылке]]. Информационный граф для алгоритма вычисления скалярного произведения можно видеть [[Скалярное произведение векторов, вещественная версия, последовательный вариант#Информационный граф|по этой ссылке]]. Информационные графы для алгоритма вычитания двух векторов и для алгоритма деления вектора на число состоят из &amp;lt;math&amp;gt;n&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;j&amp;lt;/math&amp;gt;-ой итерации алгоритма нужно выполнить следующие ярусы:&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом (вычисление &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\alpha_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;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&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;n&amp;lt;/math&amp;gt; (первая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операциями умножения в каждом, &amp;lt;math&amp;gt;n&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;n&amp;lt;/math&amp;gt; (вторая переортогонализация);&lt;br /&gt;
# &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; ярусов сложений с &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; операцией умножения в каждом (вычисление &amp;lt;math&amp;gt;\beta_j&amp;lt;/math&amp;gt;);&lt;br /&gt;
# &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; ярус делений размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (вычисление &amp;lt;math&amp;gt;q_{j + 1}&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого ширина ЯПФ одной итерации составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;4n + 2j + 3&amp;lt;/math&amp;gt;. Ширина ЯПФ всего алгоритма составляет &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, высота — &amp;lt;math&amp;gt;O(nk) + O(k^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные: вещественная симметричная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&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;n^2 + n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выходные данные: набор чисел &amp;lt;math&amp;gt;\alpha_1, \dots, \alpha_k, \beta_1, \dots, \beta_{k - 1}&amp;lt;/math&amp;gt;, набор векторов &amp;lt;math&amp;gt;q_1, \dots, q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Размер выходных данных: &amp;lt;math&amp;gt;2k - 1 + nk&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
* Алгоритм недетерминирован, так как он может досрочно завершить работу.&lt;br /&gt;
* Алгоритм устойчив благодаря операции переортогонализации.&lt;br /&gt;
* &#039;&#039;Соотношение последовательной и параллельной сложности алгоритма&#039;&#039; — &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Распараллелирование позволяет сделать алгоритм из квадратичного по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; линейным по &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &#039;&#039;Вычислительная мощность&#039;&#039; — порядка &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* В алгоритме есть длинные дуги — на протяжение всех итераций необходимо хранить набор векторов &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
* [https://www.nag.co.uk/content/nag-library The NAG Library] от Numerical Algorithms Group;&lt;br /&gt;
* Библиотека [http://www.caam.rice.edu/software/ARPACK/ ARPACK].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
[1] Деммель Дж. Вычислительная линейна алгебра. Теория и приложения. -М.: Мир, 2001. - 430 c.&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=13997</id>
		<title>Участник:Sfedotov/Алгоритм Ланцоша с полной переортогонализацией</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:Sfedotov/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D1%80%D1%82%D0%BE%D0%B3%D0%BE%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B5%D0%B9&amp;diff=13997"/>
		<updated>2016-10-26T13:26:42Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Алгоритм Ланцоша с полной переортогонализацией&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;\frac{n(n + 1)}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt;m(n + 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Автор описания: [[Участник:Sfedotov|Федотов С.А.]]&lt;br /&gt;
&lt;br /&gt;
=  Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Алгоритм Ланцоша&#039;&#039;&#039; - итерационный метод вычисления собственных значений и собственных векторов вещественной симметричной матрицы A, основными преимуществами которого являются малые затраты памяти и вычислительных ресурсов. Применяется для сильно больших матриц. Прямой алгоритм, разработанный [https://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88,_%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%BB%D0%B8%D0%B9 Корнелием Ланцошом], адаптирует степенной метод поиска наибольших собственных значений и собственных векторов линейной системы размерности &#039;&#039;n&#039;&#039; с ограниченным числом итераций, &#039;&#039;m&#039;&#039;, где &#039;&#039;m&#039;&#039; много меньше &#039;&#039;n&#039;&#039;. Метод достаточно эффективный с вычислительной точки зрения, однако в первоначальном виде неустойчив. В 1970, Ojalvo и Newman&amp;lt;ref&amp;gt;Ojalvo, I.U. and Newman, M., &amp;quot;Vibration modes of large structures by an automatic matrix-reduction method&amp;quot;, AIAA J., 8 (7), 1234–1239 (1970).&amp;lt;/ref&amp;gt; показали как добиться устойчивости и применили метод для расчета очень крупных инженерных конструкций, подверженных динамической нагрузке. В своей работе авторы также предложили способ выбора начального приближения и эмпирически оценили число итераций &#039;&#039;m&#039;&#039;. Оригинальный метод не учитывает влияние ошибок округления, поэтому на практике для арифметики с плавающей точкой используется вариант метода Ланцоша с полной переортогонализацией. Существует более быстая модификация при почти такой же точности - [[Алгоритм Ланцоша с выборочной ортогонализацией]]. В настоящее время метод широко используется в различных технических областях и имеет множество своих вариантов.&lt;br /&gt;
  &lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша соединяет в себе метод Ланцоша для построения крыловского подпространства с процедурой Рэлея-Ритца. Входными данными алгоритма служат квадратная матрица &#039;&#039;A=A&amp;lt;sup&amp;gt;T&amp;lt;sup&amp;gt;&#039;&#039;и вектор начального приближения &#039;&#039;b&#039;&#039;. Мы пытаемся найти трехдиагональную симметричную матрицу &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;AQ&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, собственные значения которой приближают собственные значения матрицы &#039;&#039;A&#039;&#039;. Иными словами на &#039;&#039;k&#039;&#039;-м шаге из ортонормированных векторов Ланцоша строится матрица &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; = [q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;,]&#039;&#039; и в качестве приближенных собственных значений матрицы &#039;&#039;A&#039;&#039; принимаются числа Ритца. Пусть &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;=V&amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt;V&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt;&#039;&#039; есть спектральное разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&#039;&#039;, столбцы матрицы &#039;&#039;Q&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;V&#039;&#039; рассматриваются как приближения к соответсвующим собственным векторам матрицы &#039;&#039;A&#039;&#039;&amp;lt;ref&amp;gt;Дж. Деммель «Вычислительная линейная алгебра» (стр. 391)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1 = &amp;amp; \frac{b}{\|b\|_2},\;\beta_0=0,\;q_0=0\\&lt;br /&gt;
for \; &amp;amp; j = 1 \; to \; k \\&lt;br /&gt;
&amp;amp; z = Aq_j\\&lt;br /&gt;
&amp;amp; \alpha_j = q^T_j z\\&lt;br /&gt;
&amp;amp; z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}\\&lt;br /&gt;
&amp;amp; z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i,\;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i \\&lt;br /&gt;
&amp;amp; \beta_j = \|z\|_2\\&lt;br /&gt;
&amp;amp; if \; \beta_j =0\; break\\&lt;br /&gt;
&amp;amp; q_{j+1} = \frac{z}{\beta_j}\\&lt;br /&gt;
end \; &amp;amp; for&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Диагональные элементы обозначены как &amp;lt;math&amp;gt;\alpha_j=t_{jj}&amp;lt;/math&amp;gt;, а элементы побочной диагонали &amp;lt;math&amp;gt;\beta_j=t_{j-1,j}=t_{j,j-1}&amp;lt;/math&amp;gt;. После каждой итерации мы вычисляем &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt;, из которых строится матрица&lt;br /&gt;
&amp;lt;math&amp;gt;T_j = \begin{pmatrix}&lt;br /&gt;
\alpha_1 &amp;amp; \beta_2  &amp;amp;          &amp;amp;             &amp;amp;              &amp;amp; 0 \\&lt;br /&gt;
\beta_2  &amp;amp; \alpha_2 &amp;amp; \beta_3  &amp;amp;             &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp; \beta_3  &amp;amp; \alpha_3 &amp;amp; \ddots      &amp;amp;              &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp; \ddots   &amp;amp; \ddots      &amp;amp; \beta_{j-1}  &amp;amp; \\&lt;br /&gt;
         &amp;amp;          &amp;amp;          &amp;amp; \beta_{j-1} &amp;amp; \alpha_{j-1} &amp;amp; \beta_j \\&lt;br /&gt;
0        &amp;amp;          &amp;amp;          &amp;amp;             &amp;amp; \beta_j      &amp;amp; \alpha_j \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Полная переортогонализация соответствует &#039;&#039;повторному&#039;&#039; проведению процесса ортогонализации Грама-Шмидта для того, чтобы почти гарантировать, что &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &#039;&#039;q&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,q&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,q&amp;lt;sub&amp;gt;j-1&amp;lt;/sub&amp;gt;&#039;&#039;. Потеря ортогонализации не заставляет алгоритм вести себя непредсказуемым образом. В качестве расплаты мы приобретаем &#039;&#039;повторные копии&#039;&#039; сошедшихся чисел Ритца. То есть для больших &#039;&#039;k&#039;&#039; матрица &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039; может иметь не одно собственное значение, очень близкое к &amp;lt;math&amp;gt;\lambda_i(A)&amp;lt;/math&amp;gt;, но много таких собственных значений. Нахождение собственных значений и собственных векторов трехдиагональной матрицы значительно проще чем их вычисление для исходной матрицы. Например при помощи &#039;&#039;&#039;MRRR&#039;&#039;&#039; алгоритма они могут быть вычислены за &#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) флопов.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
За один шаг алгоритма можно выделить следующие вычислительные ядра: &lt;br /&gt;
*умножение исходной матрицы на вектор &amp;lt;math&amp;gt;z=Aq_j&amp;lt;/math&amp;gt; &lt;br /&gt;
*процесс ортогонализации Грама-Шмидта &amp;lt;math&amp;gt;z = z - \sum^{j-1}_{i=1}\left(z^Tq_i\right)q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
Основные состовляющие алгоритма это умножение матрицы на вектор, процесс переортогонализации и поиск всех собственных значений и всех собственных векторов симметричной трехдиагональной матрицы.&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
[[file:Lanczos1.jpg|thumb|center|450px|Блок-схема алгоритма]]&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Для вычисления &#039;&#039;k&#039;&#039;-й итерации алгоритма Ланцоша с полной переортогонализацией требуется выполнить:&lt;br /&gt;
*&#039;&#039;n+2k&#039;&#039; умножений вектора на вектор &lt;br /&gt;
*&#039;&#039;2k&#039;&#039; умножение вектора на константу&lt;br /&gt;
*&#039;&#039;2k&#039;&#039; сложения векторов&lt;br /&gt;
*&#039;&#039;O&#039;&#039;(&#039;&#039;k&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;) операций на разложение матрицы &#039;&#039;T&amp;lt;sub&amp;gt;k&amp;lt;sub&amp;gt;&#039;&#039;&lt;br /&gt;
Легко проверить, что &#039;&#039;m&#039;&#039; шагов этого алгоритма потребуют &#039;&#039;O&#039;&#039;(&#039;&#039;m&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&#039;&#039;n&#039;&#039;) флопов и &#039;&#039;O&#039;&#039;(&#039;&#039;mn&#039;&#039;) слов памяти.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:Lanczos2.jpg|thumb|center|300px|Вычислительная схема &#039;&#039;j&#039;&#039;-й итерации. Синим цветом помечены промежуточные данные]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша с полной переортогонализацией в целом последовательный. На &#039;&#039;j&#039;&#039;-м шаге вычисляются числа &amp;lt;math&amp;gt;\alpha_j, \beta_j&amp;lt;/math&amp;gt; и ортонормированный вектор &amp;lt;math&amp;gt;q_{j+1}&amp;lt;/math&amp;gt;, которые служат входными данными для &#039;&#039;j+1&#039;&#039;-го шага. Нетрудно заметить, что процесс ортогонализации &#039;&#039;j&#039;&#039;-го вектора Ритца может быть вычислен параллельно, как и умножение исходной матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: матрица &amp;lt;math&amp;gt;A\in\mathbb{R}^{n\times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Дополнительные ограничения:&lt;br /&gt;
* &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – симметричная матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 1)}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
*вектор приближенных собственных значений матрицы &amp;lt;math&amp;gt;\Lambda&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;\lambda_{ii}&amp;lt;/math&amp;gt;).&lt;br /&gt;
*приближения к собственным векторам &#039;&#039;&amp;lt;math&amp;gt;v_i,i=1,\ldots, m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; m(n+1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
*Алгоритм Ланцоша не требует хранения исходной матрицы полным массивом: метод использует исходную матрицу только в операциях умножения матрицы на вектор, что позволяет эффективно использовать разреженность матрицы или регулярность структуры матрицы. Поэтому алгоритм Ланцоша может быть использован для матриц таких больших порядков, когда методы вращений и отражений не могут быть применены.&lt;br /&gt;
*Часто уже при небольшом &amp;lt;math&amp;gt;( j \sim 2 \sqrt{n})&amp;lt;/math&amp;gt; числе шагов метода крайние пары Ритца &amp;lt;math&amp;gt;(\lambda_i,v_i|[v_1,v_2,...,v_j]=Q_jV)&amp;lt;/math&amp;gt; оказываются хорошими приближениями к крайним собственным парам исходной матрицы (имеются теоретические оценки скорости сходимости, обосновывающие эту возможность), а именно крайние собственные пары часто и нужны.&lt;br /&gt;
*Если известно, что искомые (крайние) собственные значения являются кратными, то вместо простого алгоритма Ланцоша имеет смысл использовать блочный (ленточный) вариант. В блочном алгоритме Ланцоша в отличие от простого алгоритма вместо одного начального вектора берется ортонормированная система из &#039;&#039;l, l &amp;gt; 1&#039;&#039;, векторов. Аналогом векторов &amp;lt;math&amp;gt;z,q_i&amp;lt;/math&amp;gt; простого алгоритма в блочном являются прямоугольные матрицы размера &#039;&#039;n * l&#039;&#039;, аналогом скаляров &amp;lt;math&amp;gt;\beta_i, \alpha_i&amp;lt;/math&amp;gt; - квадратные матрицы порядка &#039;&#039;l&#039;&#039;, аналогом трехдиагональной матрицы &#039;&#039;T&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039; - ленточная матрица с полушириной ленты &#039;&#039;l&#039;&#039;. Такие ленточные матрицы могут иметь собственные значения кратности вплоть до &#039;&#039;l&#039;&#039;. Поэтому блочный алгоритм с &#039;&#039;l&#039;&#039; начальными вектрами используется, когда известно, что среди искомых собственных значений многие имеют кратность &#039;&#039;l&#039;&#039;. При использовании блочного алгоритма все копии кратного собственного значения будут найдены на одном шаге, в простом же алгоритме Ланцоша они определяются последовательно. Блочный алгоритм, как и [[Алгоритм Ланцоша для точной арифметики]] может быть дополнен выборочной ортогонализацией.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Алгоритм Ланцоша реализован во множестве библиотек и математических программных пакетах.&lt;br /&gt;
*библиотека [https://en.wikipedia.org/wiki/ARPACK ARPACK]  на языке FORTRAN77&lt;br /&gt;
*[http://www.nag.co.uk/numeric/fl/nagdoc_fl23/html/INDEXES/KWIC/lanczos.html NAG Library]&lt;br /&gt;
*программный пакет [http://crd-legacy.lbl.gov/~kewu/trlan.html TRLan]&lt;br /&gt;
*[https://turi.com/products/create/open_source.html GraphLab] параллельная реализация на C++&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sagak/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B2_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B5_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9&amp;diff=13996</id>
		<title>Участник:Sagak/Алгоритм Ланцоша в арифметике с плавающей точкой</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:Sagak/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9B%D0%B0%D0%BD%D1%86%D0%BE%D1%88%D0%B0_%D0%B2_%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B5_%D1%81_%D0%BF%D0%BB%D0%B0%D0%B2%D0%B0%D1%8E%D1%89%D0%B5%D0%B9_%D1%82%D0%BE%D1%87%D0%BA%D0%BE%D0%B9&amp;diff=13996"/>
		<updated>2016-10-26T13:26:26Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Автор: Айвазян Сагак Арамович &lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
===Общее описание алгоритма===&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;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&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;T_k&amp;lt;/math&amp;gt;(элементы &amp;lt;math&amp;gt;t_{ij}&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;A=A^t \in R^{n{\times}n}&amp;lt;/math&amp;gt;, тогда &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;&amp;lt;math&amp;gt;=Q_k^tAQ_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;T_k&amp;lt;/math&amp;gt;-верхняя симметричная трехдиагональная  матрица, &amp;lt;math&amp;gt;Q_k=[q_1,q_2,...,q_k]&amp;lt;/math&amp;gt;, столбцы которой образуют &lt;br /&gt;
ортонормированный базис подпространства &lt;br /&gt;
&lt;br /&gt;
Крылова &amp;lt;math&amp;gt;K_m(A,b)&amp;lt;/math&amp;gt; для заданной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и вектора &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Обозначим:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\alpha_i=t_{i,i},i=1,k &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\beta_i=t_{i-1,i},i=2,k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тогда матрица &amp;lt;math&amp;gt;T_k=\begin{bmatrix}&lt;br /&gt;
 \alpha_1 &amp;amp; \beta_2 \\&lt;br /&gt;
 \beta_2 &amp;amp; \alpha_1 &amp;amp; \beta_3 &amp;amp;\\&lt;br /&gt;
&amp;amp;. &amp;amp; . &amp;amp; .\\&lt;br /&gt;
&amp;amp;&amp;amp;\beta_{k-1} &amp;amp; \alpha_{k-1} &amp;amp; \beta_k\\&lt;br /&gt;
&amp;amp;&amp;amp;&amp;amp;\beta_k &amp;amp; \alpha_k &lt;br /&gt;
&lt;br /&gt;
 \end{bmatrix}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Записывая матричное равенство  по-векторно, получим следующий алгоритм Ланцоша.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
q_1&amp;amp;=b/||b||,\beta_0=0,q_o=0. \\&lt;br /&gt;
z&amp;amp;=Aq_j, \\&lt;br /&gt;
\alpha_j&amp;amp;=q_j^Tz, \\&lt;br /&gt;
z&amp;amp;=z-\alpha_jq_j-\beta_{j-1}q_{j-1}, \\&lt;br /&gt;
\beta&amp;amp;=||z||,\\&lt;br /&gt;
q_{j+1}&amp;amp;=z/\beta_j, \quad j \in [1, k].&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
В точной арифметике на &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;-ой итерации &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; будет ортогонален векторам &amp;lt;math&amp;gt;q_1,q_2..q_{j-1}&amp;lt;/math&amp;gt;,  но к сожалению это свойство теряется из-за округлений в арифметике с плавающей точкой. Чтобы бороться с этим, проводится полная переортоганализация,  что соответствует повторному проведению процесса ортогонализации Грамма-Шмидта   &amp;lt;math&amp;gt;z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i.&amp;lt;/math&amp;gt; Однако добавление этих двух операций делает реализацию алгоритма Ланцоша гораздо дорогостоящей.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро последовательной версии алгоритма Ланцоша  можно составить из операции  умножения вектора на матрицу и процесса полной переортогонализации, именно на них приходится основное время работы алгоритма.&lt;br /&gt;
&lt;br /&gt;
*1.   &amp;lt;math&amp;gt;Aq=( \sum\nolimits_{i=^n}a_{1i}q_i, \sum\nolimits_{i=2}^na_{2i}q_i, ..., \sum\nolimits_{i=1}^na_{ni}q_i)&amp;lt;/math&amp;gt;, как известно в операции задействуется &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;n(n-1)&amp;lt;/math&amp;gt;сложений.&lt;br /&gt;
&lt;br /&gt;
*2.    &amp;lt;math&amp;gt;z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i, &lt;br /&gt;
z=z-\sum\nolimits_{i=1}^{k}(z^Tq_i)q_i,&amp;lt;/math&amp;gt; сложность переортогонализации:&amp;lt;math&amp;gt;k(k+1)n+2k&amp;lt;/math&amp;gt; умножений и &amp;lt;math&amp;gt;k(k+1)n+2+k&amp;lt;/math&amp;gt; сложений.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Как записано и в описании ядра алгоритма, основную часть метода составляют множественные вычисления скалярных произведений&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;(x,y)=\sum\nolimits_i^nx_iy_i&amp;lt;/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;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\\&lt;br /&gt;
1 .&amp;amp; q_1=b/||b||,\\&lt;br /&gt;
2 .&amp;amp; \beta_0=0,\\&lt;br /&gt;
3 .&amp;amp;q_o=0. \\&lt;br /&gt;
\end{align}&lt;br /&gt;
&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;k&amp;lt;/math&amp;gt; по нарастанию выполняются&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
4&amp;amp;.z=Aq_j, \\&lt;br /&gt;
5&amp;amp;.\alpha_j=q_j^Tz, \\&lt;br /&gt;
6&amp;amp;.z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, \\&lt;br /&gt;
7&amp;amp;.z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, \\&lt;br /&gt;
8&amp;amp;.z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}, \\&lt;br /&gt;
9&amp;amp;.\beta=||z||,\\\end{align}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;math&amp;gt;\beta=0&amp;lt;/math&amp;gt;, то алгоритм завершается,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;10.q_{j+1}=z/\beta_j.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Для выполнения алгоритма Ланцоша в последовательном варианте требуется:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; вычислений квадратного корня,&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;k((n+1)^2+nk-1)&amp;lt;/math&amp;gt; сложений (вычитаний),&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;math&amp;gt;k((n+1)^2+2kn)&amp;lt;/math&amp;gt; умножений&lt;br /&gt;
&lt;br /&gt;
Умножения и сложения (вычитания) составляют основную часть алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф===&lt;br /&gt;
Опишем граф алгоритма в виде рисунка.&lt;br /&gt;
* Вершина черного цвета соответствует операции  &amp;lt;math&amp;gt;Aq_j,&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вершина красного цвета соответствует операции скалярного произведения &amp;lt;math&amp;gt;q_j^Tz&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вершина сиреневого цвета соответствует операции &amp;lt;math&amp;gt;z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вершина желтого цвета соответствует операции &amp;lt;math&amp;gt;z-\alpha_jq_j-\beta_{j-1}q_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вершина синего цвета соответствует операции &amp;lt;math&amp;gt;||z||&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вершина зеленого цвета соответствует операции &amp;lt;math&amp;gt;z/\beta_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
[[Файл:photo.jpg]]Здесь показаны первые три итерации алгоритма, при больших итерациях граф строится аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
Отметим, что можно подробнее расписать первые четыре операции, первая из них является стандартной операцией умножения вектора на матрицу, вторая-скалярное произведение, третье и четвертя-сумма скалярных произведений. Именно эти операции содержат ресурс параллелизма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Как видно из графа алгоритма каждая операция передает результат своих вычислений последующей операции. Соответственно никаких ресурсов параллелизма на уровне взаимодействия этих базовых операции нету. Они могут выполнятся строго последовательно. Однако, шесть операций содержат вычисления множества скалярных произведений.Стоит отметить, что в каждой итерации есть операция умножения матрицы на вектор, что представляет из себя &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;  информационно независимых скалярных произведений. Также хорошие возможности для параллельной реализации представляет повторная переортогонализация, так как на &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt; итерации обе операции ортогонализации вычисляют  &amp;lt;math&amp;gt;j-1&amp;lt;/math&amp;gt; независимых скалярных произведения.  Поскольку каждое вычисление скалярного произведения векторов длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; требует выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; операций умножения и &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; операций сложения, его сложность &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Если воспользоваться разделением данных по строкам, то в случае параллельных вычислений каждый процессор производит умножение только части (полосы) первого вектора на второй, размер этих полос равен &amp;lt;math&amp;gt;n/p&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(&amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;-количество процессоров). Следовательно, вычислительная сложность параллельного алгоритма скалярного произведения определяется выражением:&amp;lt;math&amp;gt;n/p&amp;lt;/math&amp;gt;, а мультипликативная  сложность всего алгоритма &amp;lt;math&amp;gt;O(n^2k+nk^2)/p)&amp;lt;/math&amp;gt;. При &amp;lt;math&amp;gt;p=n&amp;lt;/math&amp;gt; получаем &amp;lt;math&amp;gt;O(nk+k^2)&amp;lt;/math&amp;gt;. Однако этот метод не учитывает, то что есть скалярные произведения, которые могут вычисляться параллельно. Если учесть весь ресурс параллелизма можно получить сложность &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt;),произвольный вектор ненулевой &amp;lt;math&amp;gt;b&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;A&amp;lt;/math&amp;gt; – симметрическая матрица, т. е. &amp;lt;math&amp;gt;a_{ij}= a_{ji}, i, j = 1, \ldots, n&amp;lt;/math&amp;gt;..&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;\frac{n (n + 3)}{2}&amp;lt;/math&amp;gt; (в силу симметричности достаточно хранить только диагональ и над/поддиагональные элементы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: трехдиагональная симметрическая матрица &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (элементы &amp;lt;math&amp;gt;_{ij}&amp;lt;/math&amp;gt;), либо два вектора &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; размерности &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;2k&amp;lt;/math&amp;gt;  (в силу трехдиагональности симметричности достаточно хранить только ненулевые элементы). В разных реализациях эта экономия хранения может быть выполнена разным образом.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Алгоритм не является устойчивым, так как из-за округлений  ортогональность построенных векторов подпространства Крылова быстро теряется, вплоть до того, что некоторые из них становятся линейно зависимыми, что влечет к отсутствию приближения собственных векторов и собственных значений исходной матрицы. Именно для того, чтобы  решить это проблему, проводится полная  переортогонализация. &lt;br /&gt;
&lt;br /&gt;
Количество операций умножения и количество операций сложения имеют один и тот же порядок, но они явно преобладают над операцией взятия корня. Также сбалансированы между собой арифметические операции и операции обращений в память. Алгоритм обрабатывает матрицу и вектора и считает множество скалярных произведений, следовательно  обеспечивается хорошая сбалансированность операций между параллельными ветвями алгоритма. &lt;br /&gt;
Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов равняется &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных равняется  &amp;lt;math&amp;gt;O(k)&amp;lt;/math&amp;gt;. Алгоритм недетерминированный, так как если в какой-то итерации &amp;lt;math&amp;gt;b_j=0&amp;lt;/math&amp;gt;, то алгоритм останавливается. Также на недетерминированность может повлиять изменение порядка выполнения ассоциативных операций, в частности при вычислении скалярного произведения. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Длинных&amp;quot; дуг в информационном графе нет,  запись данных происходит предсказуемо(на каждом шаге заполняются следующие элементы выходных векторов), следовательно нет никаких потенциальных сложностей с размещением данных в иерархии памяти компьютера на этапе выполнения программы.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком алгоритма заключается в том, что высокая цена которую мы платим за переортогонализацию, ведь за &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций алгоритм потребуют &amp;lt;math&amp;gt;O(k^2n)&amp;lt;/math&amp;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; слов памяти  вместо &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при реализации без ортогонализации.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
NAG Library имеет множество процедур для решения система алгебраических уравнений и нахождения собственных значений, которые используют алгоритм Ланцоша. MATLAB содержит реализацию алгоритма в пакете  Gaussian Belief Propagation Matlab Package. GraphLab имеет библиотеку, в которой есть огромное количество параллельных реализаций алгоритма Ланцоша на языке С++. Также в библиотеках PRIMME есть реализации алгоритмов подобных алгоритму Ланцоша.&lt;br /&gt;
==Литература ==&lt;br /&gt;
ДЖ.Деммель Вычислительная линейная алгебра. М.:Мир,2001&lt;br /&gt;
&lt;br /&gt;
В. В. Вербицкий, В. В. Реут ВВЕДЕНИЕ В ЧИСЛЕННЫЕ МЕТОДЫ АЛГЕБРЫ 2015&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Joinmek&amp;diff=13878</id>
		<title>Обсуждение участника:Joinmek</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:Joinmek&amp;diff=13878"/>
		<updated>2016-10-26T08:37:32Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (2)]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* Нумерация подразделов не соответствует шаблону&lt;br /&gt;
* Разделы 1.6 и 1.8 (6 и 8 в оригинальной статье) не заполнены&lt;br /&gt;
* Картинка в разделе 1.7 (7) не является информационным графом&lt;br /&gt;
* Раздел 2.7 отсутствует&lt;br /&gt;
* Список литературы отсутствует&lt;/div&gt;</summary>
		<author><name>Sergeys79</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Sannikovats&amp;diff=13877</id>
		<title>Обсуждение участницы:Sannikovats</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Sannikovats&amp;diff=13877"/>
		<updated>2016-10-26T08:37:10Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]] ==&lt;br /&gt;
&lt;br /&gt;
* Не указан вклад обоих авторов&lt;br /&gt;
* Информационный граф выглядит странно&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Greno4ka&amp;diff=13876</id>
		<title>Обсуждение участника:Greno4ka</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:Greno4ka&amp;diff=13876"/>
		<updated>2016-10-26T08:36:50Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* В разделе 1.1 по сути нет описания алгоритма&lt;br /&gt;
* Разделы 1.6-1.8 пусты&lt;br /&gt;
* В разделах 1.3 и 1.4 хотелось бы видеть понятное словесное описание&lt;br /&gt;
* Содержимое раздела 1.4 должно быть внесено в раздел 1.5&lt;br /&gt;
* Не указан вклад каждого автора&lt;/div&gt;</summary>
		<author><name>Sergeys79</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=13875</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=13875"/>
		<updated>2016-10-26T08:36:05Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Содержимое страницы заменено на «== Статья Ортогонализация Грама-Шмидта ==»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Ортогонализация Грама-Шмидта]] ==&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sfedotov&amp;diff=13873</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=13873"/>
		<updated>2016-10-26T08:34:55Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sagak&amp;diff=13872</id>
		<title>Обсуждение участника:Sagak</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:Sagak&amp;diff=13872"/>
		<updated>2016-10-26T08:34:22Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша в арифметике с плавающей точкой.]] ==&lt;br /&gt;
* Точку в конце названия статьи лучше убрать&lt;br /&gt;
* П. 2.1. должен называться 2.7&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Joinmek&amp;diff=13726</id>
		<title>Обсуждение участника:Joinmek</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:Joinmek&amp;diff=13726"/>
		<updated>2016-10-25T13:22:18Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: /* Статья Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (2) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (2)]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья размещена не в личном пространстве автора&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* Нумерация подразделов не соответствует шаблону&lt;br /&gt;
* Разделы 1.6 и 1.8 (6 и 8 в оригинальной статье) не заполнены&lt;br /&gt;
* Картинка в разделе 1.7 (7) не является информационным графом&lt;br /&gt;
* Раздел 2.7 отсутствует&lt;br /&gt;
* Список литературы отсутствует&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Joinmek&amp;diff=13725</id>
		<title>Обсуждение участника:Joinmek</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:Joinmek&amp;diff=13725"/>
		<updated>2016-10-25T13:20:31Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Вычисление определенного интеграла с использованием адаптивно сгущающейся с…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (2)]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья размещена не в личном пространстве автора&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* Нумерация подразделов не соответствует шаблону&lt;br /&gt;
* Разделы 1.6 и 1.8 (6 и 8 в оригинальной статье) не заполнены&lt;br /&gt;
* Картинка в разделе 1.7 (7) не является информационным графом&lt;br /&gt;
* Раздел 2.7 отсутствует&lt;/div&gt;</summary>
		<author><name>Sergeys79</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Sannikovats&amp;diff=13721</id>
		<title>Обсуждение участницы:Sannikovats</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D1%86%D1%8B:Sannikovats&amp;diff=13721"/>
		<updated>2016-10-25T13:16:37Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Вычисление определенного интеграла с использованием адаптивно сгущающейся с…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки (1)]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья размещена не в личном пространстве автора&lt;br /&gt;
* Не указан вклад обоих авторов&lt;br /&gt;
* Информационный граф выглядит странно&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Greno4ka&amp;diff=13720</id>
		<title>Обсуждение участника:Greno4ka</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:Greno4ka&amp;diff=13720"/>
		<updated>2016-10-25T13:15:58Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: /* Статья Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья размещена не в личном пространстве автора&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* В разделе 1.1 по сути нет описания алгоритма&lt;br /&gt;
* Разделы 1.6-1.8 пусты&lt;br /&gt;
* В разделах 1.3 и 1.4 хотелось бы видеть понятное словесное описание&lt;br /&gt;
* Содержимое раздела 1.4 должно быть внесено в раздел 1.5&lt;br /&gt;
* Не указан вклад каждого автора&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Greno4ka&amp;diff=13715</id>
		<title>Обсуждение участника:Greno4ka</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:Greno4ka&amp;diff=13715"/>
		<updated>2016-10-25T13:10:11Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Вычисление определенного интеграла с использованием адаптивно сгущающейся с…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Вычисление определенного интеграла с использованием адаптивно сгущающейся сетки]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале страницы&lt;br /&gt;
* В разделе 1.1 по сути нет описания алгоритма&lt;br /&gt;
* Разделы 1.6-1.8 пусты&lt;br /&gt;
* В разделах 1.3 и 1.4 хотелось бы видеть понятное словесное описание&lt;br /&gt;
* Содержимое раздела 1.4 должно быть внесено в раздел 1.5&lt;br /&gt;
* Не указан вклад каждого автора&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Kozlov_Vladimir&amp;diff=13691</id>
		<title>Обсуждение участника:Kozlov Vladimir</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:Kozlov_Vladimir&amp;diff=13691"/>
		<updated>2016-10-25T12:48:50Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Kozlov Vladimir/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* Нет краткой сводки свойств алгоритма в начале статьи&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Error0x0&amp;diff=13690</id>
		<title>Обсуждение участника:Error0x0</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:Error0x0&amp;diff=13690"/>
		<updated>2016-10-25T12:47:32Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: /* Статья Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 не приведено описание вычислительного ядра&lt;br /&gt;
* Не указано ФИО автора&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sagak&amp;diff=13687</id>
		<title>Обсуждение участника:Sagak</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:Sagak&amp;diff=13687"/>
		<updated>2016-10-25T12:47:09Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша в арифметике с плавающей точкой.]] ==&lt;br /&gt;
* Точку в конце названия статьи лучше убрать&lt;br /&gt;
* Статья не в личном пространстве автора&lt;br /&gt;
* П. 2.1. должен называться 2.7&lt;br /&gt;
* Не приведена краткая сводка свойств алгоритма в начале статьи&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:DVIN&amp;diff=13685</id>
		<title>Обсуждение участника:DVIN</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:DVIN&amp;diff=13685"/>
		<updated>2016-10-25T12:43:10Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Участник:DVIN/Ортогонализация Грамма-Шмидта ==  * В разделе 1.3 определение вычисл…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:DVIN/Ортогонализация Грамма-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 определение вычислительного ядра можно опустить&lt;/div&gt;</summary>
		<author><name>Sergeys79</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=13679</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=13679"/>
		<updated>2016-10-25T12:38:43Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Ортогонализация Грама-Шмидта ==  * Статья не в личном пространстве автора * Стр…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Ортогонализация Грама-Шмидта]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья не в личном пространстве автора&lt;br /&gt;
* Странное содержание в подразделе 2.4&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Yastrebovks&amp;diff=13671</id>
		<title>Обсуждение участника:Yastrebovks</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:Yastrebovks&amp;diff=13671"/>
		<updated>2016-10-25T12:31:09Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Участник:Yastrebovks/Алгоритм Ланцоша с полной переортогонализацией ==  * Неправиль…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Yastrebovks/Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* Неправильная нумерация подразделов, искажены названия нескольких подразделов&lt;br /&gt;
* Указано два автора, но не указан вклад каждого&lt;br /&gt;
* В информационном графе не ясно, что означают троеточия&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Error0x0&amp;diff=13667</id>
		<title>Обсуждение участника:Error0x0</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:Error0x0&amp;diff=13667"/>
		<updated>2016-10-25T12:25:22Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* В разделе 1.3 не приведено описание вычислительного ядра&lt;br /&gt;
* Не указано ФИО автора&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Error0x0&amp;diff=13665</id>
		<title>Обсуждение участника:Error0x0</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:Error0x0&amp;diff=13665"/>
		<updated>2016-10-25T12:23:49Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Участник:Error0x0/Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Error0x0&amp;diff=13664</id>
		<title>Обсуждение участника:Error0x0</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:Error0x0&amp;diff=13664"/>
		<updated>2016-10-25T12:23:33Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализа…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша для арифметики с плавающей точкой с полной переортогонализацией]] ==&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sfedotov&amp;diff=13662</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=13662"/>
		<updated>2016-10-25T12:21:28Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: /* Статья Алгоритм Ланцоша с полной переортогонализацией — история изменений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша с полной переортогонализацией]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья размещена не в личном пространстве автора&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sfedotov&amp;diff=13661</id>
		<title>Обсуждение участника:Sfedotov</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:Sfedotov&amp;diff=13661"/>
		<updated>2016-10-25T12:21:10Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Алгоритм Ланцоша с полной переортогонализацией — история изменений ==  * Стат…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша с полной переортогонализацией — история изменений]] ==&lt;br /&gt;
&lt;br /&gt;
* Статья размещена не в личном пространстве автора&lt;/div&gt;</summary>
		<author><name>Sergeys79</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:Sagak&amp;diff=13659</id>
		<title>Обсуждение участника:Sagak</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:Sagak&amp;diff=13659"/>
		<updated>2016-10-25T12:18:05Z</updated>

		<summary type="html">&lt;p&gt;Sergeys79: Новая страница: «== Статья Алгоритм Ланцоша в арифметике с плавающей точкой. == * Точку в конце названия с…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Алгоритм Ланцоша в арифметике с плавающей точкой.]] ==&lt;br /&gt;
* Точку в конце названия статьи лучше убрать&lt;br /&gt;
* Статья не в личном пространстве автора&lt;br /&gt;
* П. 2.1. должен называться 2.7&lt;br /&gt;
* Раздел 2 представлен единственным пунктом&lt;/div&gt;</summary>
		<author><name>Sergeys79</name></author>
	</entry>
</feed>