Участник:Sagak/Алгоритм Ланцоша в арифметике с плавающей точкой
Алгоритм Ланцоша
Алгоритм Ланцоша – итерационный метод , созданный Корнелиусом Ланцошем, для нахождения собственных значений и собственных веторов симметричной матрицы. Суть алгоритма в том, что он сводит частичную проблему собственных значений симметричной вещественной матрицы к полной проблеме собственных значений для симметричной трехдиагональной матрицы меньшей размерности. Алгоритм применяется к матрицам большой размерности, к которым не применимы никакие прямые методы. Есть три вида алгоритма: Алгоритм Ланцоша с точной арифметикой, Алгоритм Ланцоша в арифметике с плавающей точкой и Алгоритм Ланцоша с выборочной ортогонализацией. Алгоритм Ланцоша в арифметике с плавающей точкой учитывает округления, возникающие при вычислениях.
Симметричность матрицы позволяет хранить и вычислять только чуть больше половины её элементов, что почти вдвое экономит как необходимые для вычислений объёмы памяти, так и количество операций.Также алгоритм позволяет использовать так называемый режим накопления, обусловленный тем, что значительную часть вычислений составляют вычисления скалярных произведений.
Математическое описание алгоритма
Исходные данные: положительно определённая симметрическая матрица [math]\displaystyle{ A }[/math], вектор [math]\displaystyle{ b }[/math],количество итераций [math]\displaystyle{ k }[/math].
Вычисляемые данные: трехдиагональная матрица [math]\displaystyle{ T_k }[/math](элементы [math]\displaystyle{ t_{ij} }[/math]) размерности [math]\displaystyle{ k }[/math].
Формула метода:
- [math]\displaystyle{ \begin{align} q_1&=b/||b||,\beta_0=0,q_o=0. \\ z&=Aq_j, \\ \alpha_j&=q_j^Tz, \\ z& =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, \\ \end{align} }[/math]
[math]\displaystyle{ \begin{align} \\ z&=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, \\ z&=z-\alpha_jq_j-\beta_{j-1}q_{j-1}, \\ \beta&=||z||,\\ q_{j+1}&=z/\beta_j, \quad j \in [1, k]. \end{align} }[/math]
Полная переортогонализация соответствует повторному проведению операции [math]\displaystyle{ z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, }[/math], для того чтобы почти гарантировать, что z будет ортогонален векторам [math]\displaystyle{ q_1...q_{j-1} }[/math].
Вычислительное ядро алгоритма
Вычислительное ядро последовательной версии алгоритма Ланцоша можно составить из [math]\displaystyle{ k }[/math] умножений
[math]\displaystyle{ Aq_j }[/math]
векторов на исходную матрицу
и [math]\displaystyle{ k^2+2k }[/math] скалярных произведений вида
[math]\displaystyle{ z^Tq_i, q_j^Tz }[/math].
Схема реализации последовательного алгоритма
Последовательность исполнения метода следующая:
[math]\displaystyle{ \begin{align} \\ 1 .& q_1=b/||b||,\\ 2 .& \beta_0=0,\\ 3 .&q_o=0. \\ \end{align} }[/math]
Далее для всех [math]\displaystyle{ j }[/math] от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ k }[/math] по нарастанию выполняются
[math]\displaystyle{ \begin{align} 4&.z=Aq_j, \\ 5&.\alpha_j=q_j^Tz, \\ 6&.z =z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, \\ 7&.z=z-\sum\nolimits_{i=1}^{j-1}(z^Tq_i)q_i, \\ 8&.z=z-\alpha_jq_j-\beta_{j-1}q_{j-1}, \\ 9&.\beta=||z||,\\ 1&0.q_{j+1}=z/\beta_j.\\ \end{align} }[/math]
При этом если [math]\displaystyle{ \beta=0 }[/math], то алгоритм завершается.