Обратная подстановка (вещественный вариант): различия между версиями
[непроверенная версия] | [непроверенная версия] |
Frolov (обсуждение | вклад) |
Frolov (обсуждение | вклад) |
||
Строка 67: | Строка 67: | ||
При классификации по последовательной сложности, таким образом, обратный ход метода Гаусса относится к алгоритмам ''с квадратической сложностью''. | При классификации по последовательной сложности, таким образом, обратный ход метода Гаусса относится к алгоритмам ''с квадратической сложностью''. | ||
+ | |||
+ | === Информационный граф === | ||
+ | |||
+ | Опишем [[глоссарий#Граф алгоритма|граф алгоритма]] как аналитически, так и в виде рисунка. | ||
+ | |||
+ | Граф алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двух областей разной размерности. | ||
[[Файл:DirectU.png|600px|thumb|left|описание]] | [[Файл:DirectU.png|600px|thumb|left|описание]] | ||
+ | |||
+ | '''Первая''' группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию деления. | ||
+ | Естественно введённая единственная координата каждой из вершин <math>i</math> меняется в диапазоне от <math>1</math> до <math>n</math>, принимая все целочисленные значения. | ||
+ | |||
+ | Делимое в этой операции: | ||
+ | |||
+ | * при <math>i = n</math> — элемент ''входных данных'', а именно <math>y_{n}</math>; | ||
+ | * при <math>i < n</math> — результат срабатывания операции, соответствующей вершине из второй группы, с координатами <math>i</math>, <math>i+1</math>. | ||
+ | |||
+ | Делитель для этой операции - элемент ''входных данных'', а именно <math>u_{nn}</math>. | ||
+ | |||
+ | Результат срабатывания операции является ''выходным данным'' <math>x_{i}</math>. | ||
+ | |||
+ | '''Вторая''' группа вершин расположена в двумерной области, соответствующая ей операция <math>a - b * c</math>. | ||
+ | Естественно введённые координаты области таковы: | ||
+ | * <math>i</math> — меняется в диапазоне от <math>n-1</math> до <math>1</math>, принимая все целочисленные значения; | ||
+ | * <math>j</math> — меняется в диапазоне от <math>n</math> до <math>i+1</math>, принимая все целочисленные значения. | ||
+ | |||
+ | Аргументы операции следующие: | ||
+ | *<math>a</math>: | ||
+ | ** при <math>j = n</math> элемент входных данных <math>y_{i}</math>; | ||
+ | ** при <math>j < n</math> — результат срабатывания операции, соответствующей вершине из второй группы, с координатами <math>i, j+1</math>; | ||
+ | *<math>b</math> — элемент ''входных данных'', а именно <math>u_{ij}</math>; | ||
+ | *<math>c</math> — результат срабатывания операции, соответствующей вершине из первой группы, с координатой <math>j</math>; | ||
+ | |||
+ | Результат срабатывания операции является ''промежуточным данным'' алгоритма. | ||
+ | |||
+ | Описанный граф можно посмотреть на рисунке, выполненном для случая <math>n = 5</math>. Здесь вершины первой группы обозначены розовым цветом и знаком деления, вершины второй — зелёным цветом и буквой f. Изображена подача только входных данных из вектора <math>y_{i}</math>, подача элементов матрицы <math>U</math>, идущая во все вершины, на рисунке не представлена. |
Версия 12:09, 11 сентября 2014
Содержание
1 Описание свойств и структуры алгоритма
1.1 Словесное описание алгоритма
Обратный ход метода Гаусса - решение СЛАУ [math]Ux = y[/math] с правой треугольной матрицей [math]U[/math]. Матрица [math]U[/math] - одна из составляющих матрицы [math]A[/math] и получается либо из [math]LU[/math]-разложения последней каким-либо из многочисленных способов (например, простое разложение Гаусса, разложение Гаусса с выбором ведущего элемента, компактная схема Гаусса, разложение Холецкого и др.), либо из других разложений. В силу треугольности [math]U[/math] решение СЛАУ является одной из модификаций общего метода подстановки и записывается простыми формулами.
1.2 Математическое описание
Исходные данные: правая треугольная матрица [math]U[/math] (элементы [math]u_{ij}[/math]), вектор правой части [math]y[/math] (элементы [math]y_{i}[/math]).
Вычисляемые данные: вектор решения [math]x[/math] (элементы [math]x_{i}[/math]).
Формулы метода:
- [math] \begin{align} x_{n} & = y_{n}/u_{nn} \\ x_{i} & = \left (y_{i} - \sum_{j = i+1}^{n} u_{ij} x_{j} \right ) / u_{ii}, \quad i \in [1, n - 1]. \end{align} [/math]
Существует также блочная версия метода, однако в данном описании разобран только точечный метод.
1.3 Вычислительное ядро алгоритма
Вычислительное ядро обратного хода метода Гаусса можно составить из множественных (всего их [math]n[/math]) вычислений скалярных произведений строк матрицы [math]U[/math] на уже вычисленную часть вектора [math]x[/math]:
- [math] \sum_{j = i+1}^{n} u_{ij} x_{j} [/math]
в режиме накопления или без него, в зависимости от требований задачи, с их последующим вычитанием из компоненты вектора [math]y[/math] и деления на диагональный элемент матрицы [math]U[/math]. В отечественных реализациях, даже в последовательных, упомянутый способ представления не используется. Дело в том, что даже в этих реализациях метода вычисление сумм типа
- [math] y_{i} - \sum_{j = i+1}^{n} u_{ij} x_{j} [/math]
в которых и встречаются скалярные произведения, ведутся не в порядке «вычислили скалярное произведение, а потом вычли его из элемента», а путём вычитания из элемента покомпонентных произведений, являющихся частями скалярных произведений. Поэтому следует считать вычислительным ядром метода не вычисления скалярных произведений, а вычисления выражений
- [math] y_{i} - \sum_{j = i+1}^{n} u_{ij} x_{j} [/math]
в режиме накопления или без него, в зависимости от требований задачи, плюс деления результатов этих вычислений на диагональные элементы матрицы.
1.4 Макроструктура алгоритма
Как уже записано в описании ядра алгоритма, основную часть метода составляют множественные (всего [math]n-1[/math]) вычисления сумм
- [math]y_{i} - \sum_{j = i+1}^{n} u_{ij} x_{j} [/math]
в режиме накопления или без него, плюс деления результатов этих вычислений на диагональные элементы матрицы.
1.5 Описание схемы реализации последовательного алгоритма
Чтобы понять последовательность исполнения, перепишем формулы метода так:
1. [math]x_{n} = y_{n}/u_{nn}[/math]
Далее для всех [math]i[/math] от [math]n-1[/math] до [math]1[/math] по убыванию выполняются
2. [math]x_{i} = \left (y_{i} - \sum_{j = i+1}^{n} u_{ij} x_{j} \right ) / u_{ii}[/math]
Особо отметим, что вычисления сумм вида [math]y_{i} - \sum_{j = i+1}^{n} u_{ij} x_{j}[/math] производят в режиме накопления вычитанием из [math]y_{i}[/math] произведений [math]u_{ij} x_{j}[/math] для [math]j[/math] от [math]n[/math] до [math]i + 1[/math], c убыванием [math]j[/math]. Другие порядки выполнения суммирования приводят к резкому ухудшению параллельных свойств алгоритма, хотя, к сожалению, остаются кое-где в литературе и пакетах программ.
1.6 Последовательная сложность алгоритма
Для обратного хода метода Гаусса порядка n в последовательном (наиболее быстром) варианте требуется:
- [math]n[/math] делений,
- по [math]\frac{n^2-n}{2}[/math] умножений и сложений (вычитаний) — основная часть алгоритма.
При этом использование режима накопления требует совершения умножений и вычитаний в режиме двойной точности (или использования функции вроде DPROD в Фортране), что ещё больше увеличивает долю умножений и сложений/вычитаний во времени, требуемом для выполнения обратного хода метода Гаусса.
При классификации по последовательной сложности, таким образом, обратный ход метода Гаусса относится к алгоритмам с квадратической сложностью.
1.7 Информационный граф
Опишем граф алгоритма как аналитически, так и в виде рисунка.
Граф алгоритма состоит из двух групп вершин, расположенных в целочисленных узлах двух областей разной размерности.
Первая группа вершин расположена в одномерной области, соответствующая ей операция вычисляет функцию деления. Естественно введённая единственная координата каждой из вершин [math]i[/math] меняется в диапазоне от [math]1[/math] до [math]n[/math], принимая все целочисленные значения.
Делимое в этой операции:
- при [math]i = n[/math] — элемент входных данных, а именно [math]y_{n}[/math];
- при [math]i \lt n[/math] — результат срабатывания операции, соответствующей вершине из второй группы, с координатами [math]i[/math], [math]i+1[/math].
Делитель для этой операции - элемент входных данных, а именно [math]u_{nn}[/math].
Результат срабатывания операции является выходным данным [math]x_{i}[/math].
Вторая группа вершин расположена в двумерной области, соответствующая ей операция [math]a - b * c[/math]. Естественно введённые координаты области таковы:
- [math]i[/math] — меняется в диапазоне от [math]n-1[/math] до [math]1[/math], принимая все целочисленные значения;
- [math]j[/math] — меняется в диапазоне от [math]n[/math] до [math]i+1[/math], принимая все целочисленные значения.
Аргументы операции следующие:
- [math]a[/math]:
- при [math]j = n[/math] элемент входных данных [math]y_{i}[/math];
- при [math]j \lt n[/math] — результат срабатывания операции, соответствующей вершине из второй группы, с координатами [math]i, j+1[/math];
- [math]b[/math] — элемент входных данных, а именно [math]u_{ij}[/math];
- [math]c[/math] — результат срабатывания операции, соответствующей вершине из первой группы, с координатой [math]j[/math];
Результат срабатывания операции является промежуточным данным алгоритма.
Описанный граф можно посмотреть на рисунке, выполненном для случая [math]n = 5[/math]. Здесь вершины первой группы обозначены розовым цветом и знаком деления, вершины второй — зелёным цветом и буквой f. Изображена подача только входных данных из вектора [math]y_{i}[/math], подача элементов матрицы [math]U[/math], идущая во все вершины, на рисунке не представлена.