Алгоритм Ланцоша с выборочной ортогонализацией: различия между версиями
| [непроверенная версия] | [непроверенная версия] |
Qmakar (обсуждение | вклад) Нет описания правки |
Qmakar (обсуждение | вклад) Нет описания правки |
||
| Строка 8: | Строка 8: | ||
случайный вектор <math>b </math>, являющийся первым приближением собственного вектора матрицы, <math>k </math> - количество собственных значений и собственных векторов, которые мы хотим найти, т.е. количество итераций. | случайный вектор <math>b </math>, являющийся первым приближением собственного вектора матрицы, <math>k </math> - количество собственных значений и собственных векторов, которые мы хотим найти, т.е. количество итераций. | ||
На каждой итерации строится матрица <math>Q_j = [q_1, q_2, \dots, q_j]</math> размерности <math>n \times j</math>, состоящая из ортонормированных векторов Ланцоша. В качестве приближенных собственных значений берутся числа Ритца, т.е. собственные значения симметричной трехдиагональной матрицы <math>T_j = Q^T_j A Q_j</math> размерности <math>j \times j</math>. | |||
На каждой итерации строится матрица <math>Q_j = [q_1, q_2, \dots, q_j]</math> размерности <math>n \times j</math>, состоящая из ортонормированных векторов Ланцоша <math>z</math>. В качестве приближенных собственных значений берутся числа Ритца <math>\theta_i </math>, т.е. собственные значения симметричной трехдиагональной матрицы <math>T_j = Q^T_j A Q_j</math> размерности <math>j \times j</math>. | |||
:<math> | :<math> | ||
| Строка 20: | Строка 21: | ||
</math> | </math> | ||
Однако, векторы <math>q_j </math> теряют ортогональность вследствие приобритения больших компонент в направлениях векторов Ритца <math>y_{i,j} = Q_j v_i </math>, отвечающих сошедшимся числам Ритца <math> \theta_i </math>. Поэтому предлагается на каждом шаге следить за оценками погрешностей <math>\ | Однако, векторы <math>q_j </math> теряют ортогональность вследствие приобритения больших компонент в направлениях векторов Ритца <math>y_{i,j} = Q_j v_i </math>, отвечающих сошедшимся числам Ритца <math> \theta_i </math>. Поэтому чтобы построить <math>q_j </math>, предлагается на каждом шаге следить за оценками погрешностей <math>\beta_{j-1}|v_i(j-1)|, i = 1 \dots j - 1 </math>, где <math>v_i(j-1) </math> - <math>j-1</math>-я компонента собственного вектора <math>v_i </math>. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша <math>z </math>. Величина <math>\beta_{j-1}|v_i(j-1)| </math> считается малой, если она меньше, чем <math>\sqrt{\varepsilon}||T_{j-1}|| </math>, где <math>\varepsilon</math> - доступная машинная точность чисел. | ||
=== Математическое описание алгоритма === | |||
<math> \beta_0=0,q_0=0</math> | <math> \beta_0=0,q_0=0</math> | ||
<math> q_{1} = \frac{b_{j}}{\|b\|_2}</math>, где <math> \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}</math> | <math> q_{1} = \frac{b_{j}}{\|b\|_2}</math>, где <math> \|b\|_2 = \sqrt{\sum\limits_{j=1}^{n} b_j^2}</math> | ||
Версия от 15:22, 11 декабря 2016
Свойства и структура алгоритма
Общее описание алгоритма
Алгоритм Лáнцоша представляет собой мощный метод для нахождения нескольких собственных значений и собственных векторов симметричной матрицы А и для решения систем линейных уравнений. Алгоритм особенно эффективен, если матрица А разреженная и большого размера. Однако любая практическая реализация этого алгоритма страдает от ошибок округления, т.к. векторы Ланцоша теряют взаимную ортогональность. Для того чтобы поддерживать некоторый уровень ортогональности, появились методы полной переортогонализации и выборочной ортогонализации. В этой работе мы рассмотрим последний метод в качестве способа для поддержания ортогональности среди векторов Ланцоша. Он обладает почти столь же высокой точностью, как алгоритм с полной переортогонализацией, и почти столь же низкой стоимостью, как алгоритм без ортогонализации.
Дается вещественная симметричная матрица [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{ 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} }[/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_{j-1}|v_i(j-1)|, i = 1 \dots j - 1 }[/math], где [math]\displaystyle{ v_i(j-1) }[/math] - [math]\displaystyle{ j-1 }[/math]-я компонента собственного вектора [math]\displaystyle{ v_i }[/math]. И когда какая-то оценка становится слишком малой, проводить ортогонализацию вектора Ланцоша [math]\displaystyle{ z }[/math]. Величина [math]\displaystyle{ \beta_{j-1}|v_i(j-1)| }[/math] считается малой, если она меньше, чем [math]\displaystyle{ \sqrt{\varepsilon}||T_{j-1}|| }[/math], где [math]\displaystyle{ \varepsilon }[/math] - доступная машинная точность чисел.
Математическое описание алгоритма
[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{ for\, i=1\,\, to\, \, j-1\, \, do: }[/math] [math]\displaystyle{ if\, \beta_j|v_i(j)| \leqslant \sqrt{\varepsilon}\|T_j\| }[/math] [math]\displaystyle{ z = z-(y^T_{i,j},z)y_{i,j} }[/math], где [math]\displaystyle{ y_{i,j} = Q_jv_i }[/math] [math]\displaystyle{ \beta_{j}=\|z\|_2 }[/math] [math]\displaystyle{ q_{j+1}=z/\beta_{j}, }[/math] Вычисляем собственные значения и собственные векторы полученной матрицы [math]\displaystyle{ T_j }[/math].