Участник: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/Процесс_Грама_―_Шмидта | ||
+ | # |
Версия 00:18, 17 октября 2016
Содержание
- 1 ЧАСТЬ. Свойства и структура алгоритмов
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание алгоритма
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Схема реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Ресурс параллелизма алгоритма
- 1.9 Входные и выходные данные алгоритма
- 1.10 Свойства алгоритма
- 2 ЧАСТЬ. Программная реализация алгоритма
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Локальность данных и вычислений
- 2.3 Возможные способы и особенности параллельной реализации алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 ЧАСТЬ. Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Процесс Грама-Шмидта - это алгоритм построения множества ортогональных (или ортонормированных) линейно-независимых векторов по исходному множеству векторов, при этом линейные оболочки получившегося и исходного множеств векторов совпадают.
Процесс Грама ― Шмидта также можно рассматривать как разложение невырожденной квадратной матрицы в произведение ортогональной и верхнетреугольной матрицы с положительными диагональными элементами (QR-разложение).
Задача построения или вычисления ортогонального базиса некоторого линейного подпространства или пространства часто является подзадачей более крупных широко используемых задач, так что ортогонализация Грама-Шмидта является важным алгоритмом в линейной алгебре.
1.2 Математическое описание алгоритма
- [math] \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]a_1, ..., a_n [/math] - множество исходных векторов
[math]b_1, ..., b_n[/math] - множество искомых векторов
[math]\lt a,b\gt [/math] - скалярное произведение векторов
[math]\|b\| = \sqrt{\lt b,b\gt }[/math]
1.3 Вычислительное ядро алгоритма
Вычислительным ядром алгоритма является весь алгоритм (за исключением инициализации первого вектора ортогонального базиса [math]b_1[/math]).
1.4 Макроструктура алгоритма
На уровне макроструктуры будем рассматривать [math]\frac{\lt a, b\gt }{\|b\|^2} * b[/math] как отдельную макрооперацию [math]proj_{b}a[/math]
1.5 Схема реализации последовательного алгоритма
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]
1.6 Последовательная сложность алгоритма
Сложность алгоритма - [math]O(n^3)[/math]
1.7 Информационный граф
1.8 Ресурс параллелизма алгоритма
Возможно параллельное вычисление всех [math]proj_{b_j}a_i, i=1,...n[/math] для уже найденных [math]b_j[/math] вместо вычисления каждого вектора [math]b_j[/math] по очереди. Таким образом после каждой итерации будет получен один посчитанный вектор, необходимый для расчетов на следующей итерации. Однако степень распараллеливания будет падать на каждой итерации, что вместе с необходимостью синхронизации и многочисленными обменами информации может снизить эффективность распараллеливания.
1.9 Входные и выходные данные алгоритма
Входные данные: N линейно независимых векторов (процесс Грама — Шмидта может применяться также к бесконечной последовательности линейно независимых векторов, а также к линейно зависимым векторам. В последнем случае вектор [math]a_j[/math] получится нулевым, если он зависит от векторов [math]a_1, ..., a_{j-1}[/math], и алгоритм должен сразу отбрасывать нулевые векторы)
Выходные данные: N ортогональных векторов, линейная оболочка которых совпадает с линейной оболочкой входного множества векторов.
1.10 Свойства алгоритма
Алгоритм является численно-неустойчивым из-за частой потери ортогональности, вызванной ошибками округления в процессе вычислений. Существует модификация алгоритма Грама-Шмидта, которая является более устойчивой (MGS).
Алгоритм является детерминированным.
2 ЧАСТЬ. Программная реализация алгоритма
2.1 Особенности реализации последовательного алгоритма
2.2 Локальность данных и вычислений
2.3 Возможные способы и особенности параллельной реализации алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
- реализация для системы компьютерной алгебры 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)