Участник:Valeriya Shervarly/Ортогонализация Грама-Шмидта: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Новая страница: «Ортогонализация Грама-Шмидта»
 
Нет описания правки
Строка 1: Строка 1:
Ортогонализация Грама-Шмидта
 
 
= ЧАСТЬ. Свойства и структура алгоритмов =
 
== Общее описание алгоритма ==
 
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают.
 
Процесс Грама ― Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение ортогональной и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).
 
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным алгоритмом в линейной алгебре.
 
== Математическое описание алгоритма ==
 
:: <math>
\begin{align}
b_1 & = a_1 \\
b_2 & = a_2 - \frac{<a_2, b_1>}{\|b_1\|^2} * b_1 \\
b_3 & = a_3 - \frac{<a_3, b_1>}{\|b_1\|^2} * b_1 - \frac{<a_3, b_2>}{\|b_2\|^2} * b_2 \\
... \\
b_n & = a_n - \frac{<a_n, b_1>}{\|b_1\|^2} * b_1 - ... - \frac{<a_n, b_{n-1}>}{\|b_{n-1}\|^2} * b_{n-1} \\
\end{align}
</math>
 
где:
<math>a_1, ..., a_n </math> - множество исходных векторов
 
<math>b_1, ..., b_n</math> - множество искомых векторов
 
<math><a,b></math> - скалярное произведение векторов
 
<math>\|b\| = \sqrt{<b,b>}</math>
 
== Вычислительное ядро алгоритма ==
 
Вычислительным ядром алгоритма является весь алгоритм (за исключением инициализации первого вектора ортогонального базиса <math>b_1</math>).
 
== Макроструктура алгоритма ==
 
На уровне макроструктуры будем рассматривать <math>\frac{<a, b>}{\|b\|^2} * b</math> как отдельную макрооперацию <math>proj_{b}a</math>
 
 
== Схема реализации последовательного алгоритма ==
 
input: a
output: b
 
for j = 1,...,n
    b[j] = a[j]
    for k = 1,...,j-1
        b[j] = b[j] - <a[j],b[k]>/<b[k],b[k]>*b[k]
 
 
== Последовательная сложность алгоритма ==
 
Сложность алгоритма - <math>O(n^3)</math>
 
 
== Информационный граф ==
 
 
== Ресурс параллелизма алгоритма ==
 
Возможно параллельное вычисление всех <math>proj_{b_j}a_i, i=1,...n</math> для уже найденных <math>b_j</math> вместо вычисления каждого вектора <math>b_j</math> по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.
 
 
== Входные и выходные данные алгоритма ==
 
'''Входные данные:'''
N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор <math>a_j</math> получится нулевым, если он зависит от векторов <math>a_1, ..., a_{j-1}</math>, и алгоритм должен сразу отбрасывать нулевые векторы)
 
'''Выходные данные:'''
N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов.
 
 
== Свойства алгоритма ==
 
Алгоритм является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений.
Существует модификация алгоритма Грама-Шмидта, которая является более устойчивой (MGS).
 
Алгоритм является детерминированным.
 
 
= ЧАСТЬ. Программная реализация алгоритма =
 
 
== Особенности реализации последовательного алгоритма ==
 
 
== Локальность данных и вычислений ==
 
 
== Возможные способы и особенности параллельной реализации алгоритма ==
 
 
== Масштабируемость алгоритма и его реализации ==
 
 
== Динамические характеристики и эффективность реализации алгоритма ==
 
 
== Выводы для классов архитектур ==
 
 
== Существующие реализации алгоритма ==
 
* реализация для системы компьютерной алгебры [http://maxima.sourceforge.net/ maxima] (GNU GPL)
 
load(eigen);
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);
y: gramschmidt(x);
 
* пример реализации для системы компьютерной алгебры [http://www.wolfram.com/mathematica/ mathematica] (проприетарное программное обеспечение)
 
Projection[v1_, v2_] := (v1.v2*v2)/v2.v2
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &) /@ vecs
GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &, {}, mat]
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]
 
* библиотека [https://github.com/fplll/fplll fplll] (функция GSO) (GNU LESSER GENERAL PUBLIC LICENSE)
 
* [http://numerics.mathdotnet.com/ Math.NET Numerics] (функция MathNet.Numerics.LinearAlgebra.Factorization.GramSchmidt<T>)
 
* библиотека [https://www.nag.co.uk/ NAG] ([http://www.nag.co.uk/numeric/Fl/manual/pdf/F05/f05aaf.pdf F05AAF])
 
* библиотека [https://www.mcs.anl.gov/petsc/documentation/index.html PETSc] (KSPGMRESClassicalGramSchmidtOrthogonalization)
 
 
= Литература =
 
# https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта
#

Версия от 21:18, 16 октября 2016


ЧАСТЬ. Свойства и структура алгоритмов

Общее описание алгоритма

Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают.

Процесс Грама ― Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение ортогональной и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).

Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным алгоритмом в линейной алгебре.

Математическое описание алгоритма

[math]\displaystyle{ \begin{align} b_1 & = a_1 \\ b_2 & = a_2 - \frac{\lt a_2, b_1\gt }{\|b_1\|^2} * b_1 \\ b_3 & = a_3 - \frac{\lt a_3, b_1\gt }{\|b_1\|^2} * b_1 - \frac{\lt a_3, b_2\gt }{\|b_2\|^2} * b_2 \\ ... \\ b_n & = a_n - \frac{\lt a_n, b_1\gt }{\|b_1\|^2} * b_1 - ... - \frac{\lt a_n, b_{n-1}\gt }{\|b_{n-1}\|^2} * b_{n-1} \\ \end{align} }[/math]

где: [math]\displaystyle{ a_1, ..., a_n }[/math] - множество исходных векторов

[math]\displaystyle{ b_1, ..., b_n }[/math] - множество искомых векторов

[math]\displaystyle{ \lt a,b\gt }[/math] - скалярное произведение векторов

[math]\displaystyle{ \|b\| = \sqrt{\lt b,b\gt } }[/math]

Вычислительное ядро алгоритма

Вычислительным ядром алгоритма является весь алгоритм (за исключением инициализации первого вектора ортогонального базиса [math]\displaystyle{ b_1 }[/math]).

Макроструктура алгоритма

На уровне макроструктуры будем рассматривать [math]\displaystyle{ \frac{\lt a, b\gt }{\|b\|^2} * b }[/math] как отдельную макрооперацию [math]\displaystyle{ proj_{b}a }[/math]


Схема реализации последовательного алгоритма

input: a
output: b
for j = 1,...,n
    b[j] = a[j]
    for k = 1,...,j-1
        b[j] = b[j] - <a[j],b[k]>/<b[k],b[k]>*b[k]


Последовательная сложность алгоритма

Сложность алгоритма - [math]\displaystyle{ O(n^3) }[/math]


Информационный граф

Ресурс параллелизма алгоритма

Возможно параллельное вычисление всех [math]\displaystyle{ proj_{b_j}a_i, i=1,...n }[/math] для уже найденных [math]\displaystyle{ b_j }[/math] вместо вычисления каждого вектора [math]\displaystyle{ b_j }[/math] по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.


Входные и выходные данные алгоритма

Входные данные: N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор [math]\displaystyle{ a_j }[/math] получится нулевым, если он зависит от векторов [math]\displaystyle{ a_1, ..., a_{j-1} }[/math], и алгоритм должен сразу отбрасывать нулевые векторы)

Выходные данные: N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов.


Свойства алгоритма

Алгоритм является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений. Существует модификация алгоритма Грама-Шмидта, которая является более устойчивой (MGS).

Алгоритм является детерминированным.


ЧАСТЬ. Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Возможные способы и особенности параллельной реализации алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

  • реализация для системы компьютерной алгебры maxima (GNU GPL)
load(eigen);
x: matrix ([-2,1,0],[-2,0,1],[-0.5,-1,1]);
y: gramschmidt(x);
  • пример реализации для системы компьютерной алгебры mathematica (проприетарное программное обеспечение)
Projection[v1_, v2_] := (v1.v2*v2)/v2.v2
MultipleProjection[v1_, vecs_] := Plus @@ (Projection[v1, #1] &) /@ vecs
GramSchmidt[mat_] := Fold[Join[#1, {Normalize[#2 - MultipleProjection[#2, #1]]}] &, {}, mat]
GramSchmidt[{{-2, 1, 0}, {-2, 0, 1}, {-0.5, -1, 1}}]
  • библиотека fplll (функция GSO) (GNU LESSER GENERAL PUBLIC LICENSE)
  • Math.NET Numerics (функция MathNet.Numerics.LinearAlgebra.Factorization.GramSchmidt<T>)
  • библиотека PETSc (KSPGMRESClassicalGramSchmidtOrthogonalization)


Литература

  1. https://ru.wikipedia.org/wiki/Процесс_Грама_―_Шмидта