Алгоритм Ланцоша с выборочной ортогонализацией: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Строка 79: Строка 79:
Матрица  <math> A </math>, начальный вектор  <math> b </math> и число собственных значений, которые мы хотим найти  <math> k </math>.
Матрица  <math> A </math>, начальный вектор  <math> b </math> и число собственных значений, которые мы хотим найти  <math> k </math>.


Ввиду симметричности из матрицы <math> A </math> достаточно хранить только ее диагональ и элементы, лежащие выше ее. Таким образом, объем входных данных  
Ввиду симметричности из матрицы <math> A </math> достаточно хранить только ее диагональ и элементы, лежащие выше ее. Таким образом, объем входных данных:


<math>\frac{n (n + 1)}{2} + n + 1 = \frac{n^2+3n+2}{2}.</math>
<math>\frac{n (n + 1)}{2} + n + 1 = \frac{n^2+3n+2}{2}.</math>
Строка 87: Строка 87:
Матрица собственных значений <math> \Lambda = diag(\lambda_1 \dots \lambda_k) </math>, матрица собственных векторов <math> V = [v_1 \dots v_k] </math> размера <math> n \times k </math>
Матрица собственных значений <math> \Lambda = diag(\lambda_1 \dots \lambda_k) </math>, матрица собственных векторов <math> V = [v_1 \dots v_k] </math> размера <math> n \times k </math>


Так, объем выходных данных  <math> k + kn </math>
Так, объем выходных данных: <math> k + kn </math>


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

Версия от 20:40, 11 декабря 2016

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

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

Алгоритм Лáнцоша представляет собой мощный метод для нахождения нескольких собственных значений и собственных векторов симметричной матрицы А и для решения систем линейных уравнений. Алгоритм особенно эффективен, если матрица А разреженная и большого размера. Однако любая практическая реализация этого алгоритма страдает от ошибок округления, т.к. векторы Ланцоша теряют взаимную ортогональность. Для того чтобы поддерживать некоторый уровень ортогональности, появились методы полной переортогонализации и выборочной ортогонализации. В этой работе мы рассмотрим последний метод в качестве способа для поддержания ортогональности среди векторов Ланцоша. Он обладает почти столь же высокой точностью, как алгоритм с полной переортогонализацией, и почти столь же низкой стоимостью, как алгоритм без ортогонализации [1].


Дается вещественная симметричная матрица [math]\displaystyle{ A = A^T }[/math],

[math]\displaystyle{ A = \begin{pmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1\ n-1} & a_{1\ n} \\ a_{12} & a_{22} & a_{23} & \cdots & a_{2\ n-1} & a_{2\ n} \\ a_{13} & a_{23} & a_{33} & \cdots & a_{3\ n-1} & a_{3\ n} \\ \vdots & \vdots & \ddots & \ddots & \ddots & \vdots \\ a_{1\ n-1} & \cdots & \cdots & a_{n-2\ n-1} & a_{n-1\ n-1} & a_{n-1\ n} \\ a_{1\ n} & \cdots & \cdots & a_{n-2\ n} & a_{n-1\ n} & a_{n\ n} \\ \end{pmatrix} }[/math] [math]\displaystyle{ \, \; (1), }[/math]

случайный вектор [math]\displaystyle{ b }[/math], являющийся первым приближением собственного вектора матрицы, [math]\displaystyle{ k }[/math] - количество собственных значений и собственных векторов, которые мы хотим найти, т.е. количество итераций.


На каждой итерации строится матрица [math]\displaystyle{ Q_j = [q_1, q_2, \dots, q_j] }[/math] размерности [math]\displaystyle{ n \times j }[/math], состоящая из ортонормированных векторов Ланцоша [math]\displaystyle{ z }[/math]. В качестве приближенных собственных значений берутся числа Ритца [math]\displaystyle{ \theta_i }[/math], т.е. собственные значения симметричной трехдиагональной матрицы [math]\displaystyle{ T_j = Q^T_j A Q_j }[/math] размерности [math]\displaystyle{ j \times j }[/math].

[math]\displaystyle{ T_j = \begin{pmatrix} \alpha_1 & \beta_1 \\ \beta_1 & \alpha_2 & \beta_2 \\ & \beta_2 & \ddots & \ddots \\ & & \ddots & \ddots & \beta_{j-1} \\ & & & \beta_{j-1} & \alpha_j \end{pmatrix}\; (2). }[/math]

Однако, векторы [math]\displaystyle{ q_j }[/math] теряют ортогональность вследствие приобретения больших компонент в направлениях векторов Ритца [math]\displaystyle{ y_{i,j} = Q_j v_i }[/math], отвечающих сошедшимся числам Ритца [math]\displaystyle{ \theta_i }[/math]. Поэтому чтобы построить [math]\displaystyle{ q_j }[/math], предлагается на каждом шаге следить за оценками погрешностей [math]\displaystyle{ \beta_{t}|v_i(t)|, i = 1 \dots t, t = j - 1 }[/math], где [math]\displaystyle{ v_i(t) }[/math] - [math]\displaystyle{ t }[/math]-я компонента собственного вектора [math]\displaystyle{ v_i }[/math]. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша [math]\displaystyle{ z }[/math]. Величина [math]\displaystyle{ \beta_{t}|v_i(t)| }[/math] считается малой, если она меньше, чем [math]\displaystyle{ \sqrt{\varepsilon}||T_{t}|| }[/math], где [math]\displaystyle{ \varepsilon }[/math] - доступная машинная точность чисел.


После следует вычисление собственных значений [math]\displaystyle{ \theta_j }[/math] и собственных векторов [math]\displaystyle{ v_j }[/math] полученной трехдиагональной матрицы [math]\displaystyle{ T_j }[/math], для чего существует, например, метод "разделяй и властвуй"[2]

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

[math]\displaystyle{  \beta_0=0,q_0=0 }[/math]
[math]\displaystyle{  q_{1} = \frac{b_{j}}{\|b\|_2} }[/math], где [math]\displaystyle{  \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2} }[/math]
[math]\displaystyle{  for\, j=1\,\, to\, \, k\, \, do: }[/math]
    [math]\displaystyle{ z=Aq_j,   }[/math]
    [math]\displaystyle{ \alpha_j=q_j^Tz,  }[/math]
    [math]\displaystyle{ z=z-\alpha_jq_j-\beta_{j-1}q_{j-1},   }[/math]
    [math]\displaystyle{ t = j - 1,   }[/math]
    [math]\displaystyle{ for\, i=1\,\, to\, \, t\, \, do:  }[/math]
        [math]\displaystyle{ if\,  \beta_{t}|v_i(t)| \leqslant \sqrt{\varepsilon}\|T_{t}\| \, \,  then: }[/math]
            [math]\displaystyle{ z = z-(y^T_{i,t},z)y_{i,t}  }[/math], где [math]\displaystyle{ y_{i,t} = Q_{t}v_i }[/math] 
    [math]\displaystyle{ \beta_{j}=\|z\|_2  }[/math]
    [math]\displaystyle{ q_{j+1}=z/\beta_{j},  }[/math]
    Строим матрицу  [math]\displaystyle{  T_j }[/math] (2), вычисляем собственные значения  [math]\displaystyle{  \theta_j  }[/math] и собственные векторы [math]\displaystyle{ v_j  }[/math] полученной матрицы [math]\displaystyle{ T_j }[/math].

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

Выделены следующие вычислительные ядра:

  • Умножение матрицы на вектор, [math]\displaystyle{ z=Aq_j, }[/math].


  • Ортогонализация по отношению к сошедшимся векторам [math]\displaystyle{ z = z-(y^T_{i,t},z)y_{i,t} }[/math] для [math]\displaystyle{ i = 1 \dots t }[/math]


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

Были выделены следующие макрооперации:

1. Умножение матрицы на вектор,

[math]\displaystyle{ z=Aq_j, }[/math].

2. Вычисление вектора [math]\displaystyle{ q_{j+1} }[/math] с помощью линейной комбинации других векторов:

[math]\displaystyle{ \alpha_j=q_j^Tz, }[/math]

[math]\displaystyle{ z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}, }[/math]

[math]\displaystyle{ q_{j+1}=z/\|z\|_2 }[/math]

3. Ортогонализация вектора Ланцоша с помощью скалярного произведения:

[math]\displaystyle{ z = z-(y^T_{i,t},z)y_{i,t} }[/math]

4. Для вычисления собственных значений матрицы будет использоваться алгоритм "разделяй и властвуй".

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

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

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

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

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

Входные данные

Матрица [math]\displaystyle{ A }[/math], начальный вектор [math]\displaystyle{ b }[/math] и число собственных значений, которые мы хотим найти [math]\displaystyle{ k }[/math].

Ввиду симметричности из матрицы [math]\displaystyle{ A }[/math] достаточно хранить только ее диагональ и элементы, лежащие выше ее. Таким образом, объем входных данных:

[math]\displaystyle{ \frac{n (n + 1)}{2} + n + 1 = \frac{n^2+3n+2}{2}. }[/math]

Выходные данные

Матрица собственных значений [math]\displaystyle{ \Lambda = diag(\lambda_1 \dots \lambda_k) }[/math], матрица собственных векторов [math]\displaystyle{ V = [v_1 \dots v_k] }[/math] размера [math]\displaystyle{ n \times k }[/math]

Так, объем выходных данных: [math]\displaystyle{ k + kn }[/math]

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

Программная реализация алгоритма

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

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

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

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

ЭТО

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

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

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

Алгоритм Ланцоша реализован в различных пакетах, библиотеках и проектах

NAG Library http://www.nag.com/content/nag-library C, C++, Fortran, C#, MATLAB, R

ARPACK https://people.sc.fsu.edu/~jburkardt/m_src/arpack/arpack.html MATLAB

GrapLab https://turi.com/products/create/open_source.html C++

Gaussian Belief Propagation Matlab Package http://www.cs.cmu.edu/~bickson/gabp/ MATLAB

The IETL Project http://www.comp-phys.org/software/ietl/ C++

LANSO/PLANSO http://web.cs.ucdavis.edu/~bai/ET/lanczos_methods/overview_PLANSO.html Fortran

Julia Math https://github.com/JuliaMath/IterativeSolvers.jl Julia

Литература

  1. ↑ "The Lanczos Algorithm With Partial Reorthogonalization", Horst D. Simon, Mathematics of computation, volume 42, number 165, pages 115-142 (1984)
  2. ↑ Дж. Деммель «Вычислительная линейная алгебра», c. 232, алгоритм 5.2