Участник:Сорокин Александр/Метод сопряженных градиентов (Решение СЛАУ): различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 19: Строка 19:
Предположим что у нас есть ''n'' линейно-независимых векторов <math> p_1, ... p_n </math> таких что <math> (p_i, p_j)_A = (Ap_i, p_j) = 0, i \neq j </math>. <br>
Предположим что у нас есть ''n'' линейно-независимых векторов <math> p_1, ... p_n </math> таких что <math> (p_i, p_j)_A = (Ap_i, p_j) = 0, i \neq j </math>. <br>
Так как имеется ''n'' таких векторов, то они образуют базис пространства и любой вектор можно выразить через них, в том числе <math> x^* - x_0 = \sum_{i = 1}^n \alpha_i p_i </math>. <br>
Так как имеется ''n'' таких векторов, то они образуют базис пространства и любой вектор можно выразить через них, в том числе <math> x^* - x_0 = \sum_{i = 1}^n \alpha_i p_i </math>. <br>
Домножим это равенство А-скалярно на <math> p_k </math> для всех ''k''. С левой стороны получим <math> (x^* - x_0, p_k)_A = (b - Ax_0, p_k) = p_k ^T r_0 </math>. С правой: <math> \sum_{i = 1}^n \alpha_i (p_i, p_k)_A = \alpha_k (p_k, p_k)_A = \alpha_k p_k ^T A p_k </math>.
Домножим это равенство А-скалярно на <math> p_k </math> для всех ''k''. С левой стороны получим <math> (x^* - x_0, p_k)_A = (b - Ax_0, p_k) = p_k ^T r_0 </math>. С правой: <math> \sum_{i = 1}^n \alpha_i (p_i, p_k)_A = \alpha_k (p_k, p_k)_A = \alpha_k p_k ^T A p_k </math>. Тем самым <math> \alpha_k = \frac{p_k^T r_0}{p_k^T A p_k} </math>.


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

Версия от 15:13, 22 октября 2017

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

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

Метод сопряженных градиентов представляет собой итерационный метод для численного решения системы уравнений с симметричной и положительно определенной матрицей, является итерационным методом Крыловского типа. Основная идея метода заключается в том, чтобы минимизировать на подпространствах Крылова А-норму ошибки.

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

Пусть необходимо найти решение системы уравнений [math]\displaystyle{ Ax = b }[/math], где [math]\displaystyle{ A^* = A \gt 0 }[/math].
Рассмотрим функционал [math]\displaystyle{ \phi (x) = \frac{1}{2}x^T A x - x^T b }[/math].
Если [math]\displaystyle{ x^* }[/math] это решение задачи минимизации данного функционала, то в этой точке градиент [math]\displaystyle{ \bigtriangledown \phi (x^*) = Ax^* - b }[/math] должен быть равен нулю. Таким образом, минимизируя функционал [math]\displaystyle{ \phi (x) }[/math] мы получим решение исходной системы.

Метод градиентного спуска

Как известно, градиент [math]\displaystyle{ \bigtriangledown \phi (x) }[/math] является направлением наибольшего роста функции.
Метод градиентного спуска основан на стратегии движения в строну, противоположную возрастанию функционала. Оптимальным направлением в этом случае будет антиградиент [math]\displaystyle{ -\bigtriangledown \phi (x) }[/math] и двигаться по нему нужно будет до тех пор, пока функционал убывает.
Таким образом можно построить следующий итерационный метод:

  1. Выберем произвольное начальное приближение [math]\displaystyle{ x_0 }[/math].
  2. [math]\displaystyle{ x_{i+1} = x_{i} + \alpha_i p_i }[/math], где [math]\displaystyle{ p_i }[/math] — направление движения, а [math]\displaystyle{ \alpha_i }[/math] — величина шага.

Из рассуждений выше понятно что оптимальным является направление [math]\displaystyle{ p_i = - \bigtriangledown \phi (x_{i}) = b - Ax_i = r_i }[/math]. Величина [math]\displaystyle{ \alpha_i }[/math] выбирается из соображений [math]\displaystyle{ \alpha_i = \underset{\alpha}{\operatorname{argmin}} \phi (x_i + \alpha p_i) }[/math]. Аналитическую формулу [math]\displaystyle{ \alpha_i = \frac{\bigtriangledown\phi (x_i)^T \bigtriangledown\phi (x_i)}{\bigtriangledown\phi (x_i)^T A \bigtriangledown\phi (x_i)} = \frac{r_i ^T r_i}{r_i ^T A r_i} }[/math] можно получить из [math]\displaystyle{ \frac{d}{d\alpha} \phi (x_i + \alpha p_i) = 0 }[/math].

Метод сопряженных направлений

Метод градиентного спуска обычно сходится очень долго. Можно построить алгоритм который сходится не больше чем за n шагов.
Предположим что у нас есть n линейно-независимых векторов [math]\displaystyle{ p_1, ... p_n }[/math] таких что [math]\displaystyle{ (p_i, p_j)_A = (Ap_i, p_j) = 0, i \neq j }[/math].
Так как имеется n таких векторов, то они образуют базис пространства и любой вектор можно выразить через них, в том числе [math]\displaystyle{ x^* - x_0 = \sum_{i = 1}^n \alpha_i p_i }[/math].
Домножим это равенство А-скалярно на [math]\displaystyle{ p_k }[/math] для всех k. С левой стороны получим [math]\displaystyle{ (x^* - x_0, p_k)_A = (b - Ax_0, p_k) = p_k ^T r_0 }[/math]. С правой: [math]\displaystyle{ \sum_{i = 1}^n \alpha_i (p_i, p_k)_A = \alpha_k (p_k, p_k)_A = \alpha_k p_k ^T A p_k }[/math]. Тем самым [math]\displaystyle{ \alpha_k = \frac{p_k^T r_0}{p_k^T A p_k} }[/math].

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Литература