Непроверенная

Решение левой двухдиагональной СЛАУ с единичной диагональю, вещественная версия, последовательный вариант

Материал из Алговики
Перейти к навигации Перейти к поиску

Описание свойств и структуры алгоритма[править]

Словесное описание алгоритма[править]

Решаемая задача[править]

Дана система линейных алгебраических уравнений (СЛАУ) с нижней (левой) двухдиагональной матрицей, в которой диагональные элементы равны 1:

[math]\displaystyle{ \begin{align} x_1 & = b_1, \\ a_1 x_1 + x_2 & = b_2, \\ \vdots \\ a_{k - 1} x_{k - 1} + x_k & = b_k, \\ \vdots \\ a_{n - 1} x_{n - 1} + x_n & = b_n. \end{align} }[/math]

Нужно найти все компоненты вектора [math]\displaystyle{ \vec{x} }[/math].

Общая схема[править]

Фактически последовательная схема решения задачи реализует последовательное решение одного уравнения за другим, с последующей подстановкой полученных компонент искомого вектора в следующие уравнения.

Математическое описание[править]

Исходные данные: одномерный массив [math]\displaystyle{ n - 1 }[/math] чисел [math]\displaystyle{ a_k }[/math] и одномерный массив [math]\displaystyle{ n }[/math] чисел [math]\displaystyle{ b_k }[/math].

Вычисляемые данные: одномерный массив [math]\displaystyle{ n }[/math] чисел [math]\displaystyle{ x_k }[/math].

Формулы метода:

[math]\displaystyle{ \begin{align} x_1 & = b_1, \\ x_k & = b_k - a_{k - 1} x_{k - 1}, \quad k = 2, \dots, n. \end{align} }[/math]

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

Вычислительное ядро последовательной схемы решения задачи можно представить в качестве последовательного набора [math]\displaystyle{ n - 1 }[/math] «двойных» операций (умножение элементов получаемого массива на элемент одного из входных массивов и вычитание результата из следующего элемента другого входного массива).

Макроструктура алгоритма[править]

Как уже записано в описании ядра алгоритма, основную часть вычисления составляет массовый последовательный набор «двойных» операций (умножение элементов получаемого массива на элемент одного из входных массивов и вычитание результата из следующего элемента другого входного массива).

Описание схемы реализации последовательного алгоритма[править]

Формулы метода описаны выше. Последовательность исполнения — по возрастанию индексов.

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

Для вычисления решения для СЛАУ порядка [math]\displaystyle{ n }[/math], количество операций умножения равно количеству операций вычитания и равно [math]\displaystyle{ n - 1 }[/math]. Поэтому алгоритм должен быть отнесён к алгоритмам линейной сложности по количеству последовательных операций.

Информационный граф[править]

Опишем граф алгоритма в виде рисунка. Изображён граф для [math]\displaystyle{ n = 7 }[/math]. Как видно, граф чисто последовательный.

Описание ресурса параллелизма алгоритма[править]

Последовательный вариант вычисления не имеет ресурсов параллелизма. Его ЯПФ единственна и совпадает с последовательным алгоритмом. Таким образом, в получившемся алгоритме высота параллельной формы будет равна [math]\displaystyle{ n - 1 }[/math] операций умножения плюс [math]\displaystyle{ n - 1 }[/math] операций вычитания. В таком виде алгоритм должен быть отнесён к алгоритмам линейной сложности по высоте параллельной формы. Ширина параллельной формы равна [math]\displaystyle{ 1 }[/math], что даёт нам постоянную сложность по ширине параллельной формы.

Описание входных и выходных данных[править]

Входные данные: массив [math]\displaystyle{ a }[/math] (элементы [math]\displaystyle{ a_i }[/math] с номерами от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ n - 1 }[/math]), массив [math]\displaystyle{ b }[/math] (элементы [math]\displaystyle{ b_i }[/math] с номерами от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ n }[/math]).

Дополнительные ограничения: отсутствуют.

Объём входных данных: [math]\displaystyle{ 2n - 1 }[/math].

Выходные данные: массив [math]\displaystyle{ x }[/math] (элементы [math]\displaystyle{ x_k }[/math] с номерами от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ n }[/math]).

Объём выходных данных: [math]\displaystyle{ n }[/math].

Свойства алгоритма[править]

Соотношение последовательной и параллельной сложности в случае неограниченных ресурсов, как хорошо видно, является константой (1). При этом вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных — всего-навсего 1 (входных и выходных данных почти столько же, сколько операций; если точнее — даже больше в полтора раза). При этом алгоритм полностью детерминирован. Дуги информационного графа локальны.

Программная реализация[править]

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

На Фортране можно записать так:

	x(1) = b(1)
	DO I = 2, N
		x(I) = b(I)-a(I-1)*x(I-1)
	END DO

Описание локальности данных и вычислений[править]

Описание локальности алгоритма[править]

Описание локальности реализации алгоритма[править]

Описание структуры обращений в память и качественная оценка локальности[править]
Количественная оценка локальности[править]
Анализ на основе теста Apex-Map[править]

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

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

Описание масштабируемости алгоритма[править]

Описание масштабируемости реализации алгоритма[править]

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

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

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

Помимо выписанной выше простейшей реализации, существуют коды, реализующие алгоритм для одновременного решения многих систем с разной правой частью, но одинаковыми матрицами. В основном это происходит потому, что такая задача и её решения обычно и используют там, где могут появляться наборы однотипных СЛАУ, что даёт возможность распараллеливания если не решения одной СЛАУ, то коллективного алгоритма, который объединяет решение многих систем.