Московский государственный университет путей сообщения
Опубликован: 22.12.2006 | Доступ: свободный | Студентов: 2202 / 463 | Оценка: 4.07 / 4.02 | Длительность: 16:07:00
ISBN: 978-5-9556-0071-0
Специальности: Разработчик аппаратуры
Лекция 11:

Программирование задач для асинхронной ВС архитектуры "data flow"

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >

Решение системы линейных уравнений методом Гаусса

Суть метода заключается в сведении системы линейных уравнений с помощью линейных преобразований к ступенчатому виду. Тогда из последнего уравнения находится значение одного неизвестного. Поднимаясь на одно уравнение вверх, с его помощью находим значение другого неизвестного и т.д. Т.е. предполагается некоторый "проход" по уравнениям системы сверху вниз, а затем обратный проход снизу вверх.

Программу составим для произвольного значения n — числа уравнений (неизвестных). Однако для наглядности зафиксируем n=4.

Итак, система уравнений имеет вид

\begin{align*}
 \left \{
  \begin{array}{rcl}
  a_{00} x_0 + a_{01} x_1 + a_{02} x_2 + a_{03} x_3 = a_{04} \\
  a_{10} x_0 + a_{11} x_1 + a_{12} x_2 + a_{13} x_3 = a_{14} \\
  a_{20} x_0 + a_{21} x_1 + a_{22} x_2 + a_{23} x_3 = a_{24} \\
  a_{30} x_0 + a_{31} x_1 + a_{32} x_2 + a_{33} x_3 = a_{34} \\
  \end{array}
 \right.
\end{align*}

Умножим второе уравнение на r1 = a00 / a10 и вычтем из него первое уравнение. Получим новое уравнение, в котором коэффициенты находятся из выражения

a_{1j}^{(1)} = \frac{a_{1j} \times a_{00}}{a_{10}} - a_{0j},
при этом
a_{10}^{(1)} = \frac{a_{10} \times a_{00}}{a_{10}} - a_{00} = 0.

Аналогично, умножая все последующие (k = 2, ...) уравнения на соответствующие величины a00 / ak0 и вычитая первое уравнение, избавимся от вхождения в них переменной x0.

Произведен первый шаг в получении ступенчатой системы уравнений (рис. 11.5). При этом мы, конечно, считаем, что a_{10} \ne  0. Если это не так, но выполняется известное условие существования единственного решения системы, то надо так переупорядочить (переобозначить) вхождение переменных, чтобы нужный коэффициент был отличен от нуля. Такое переупорядочение переменных в приведенной ниже программе предусмотрено.

Схема счёта методом Гаусса

Рис. 11.5. Схема счёта методом Гаусса

На втором шаге вычитаем преобразованное второе уравнение из всех последующих уравнений, предварительно умноженных на r2 = a11(1) / ak1(1). Таким образом мы избавляемся от вхождения в них второй переменной и т.д.

На последнем шаге таких преобразований получаем выражение для нахождения последней переменной. В нашем примере это

a33(3) x3 = a34(3).

Найденное значение x3 подставим в уравнение

a22(2) x2 + a23(2) x3 = a24(2).

и найдем значение x2 и т.д.

Программа коммутации представлена на рис. 11.6a и 11.6b.

Программа решения системы линейных уравнений

Рис. 11.6a. Программа решения системы линейных уравнений

Окончание

Рис. 11.6b. Окончание

По команде 0 загружаются число переменных в уравнении и адреса коэффициентов. Команды 1 \div  5 производят начальное формирование индексных регистров.

Команда 6 начинает основной цикл на n-1 повторений.

По команде 7 загружаются модификаторы, причем после первого выполнения будут справедливы равенства:

(M4) = a00; (M5) = a11; (M6) = a01.

Команда 8 проверяет равенство a00 = 0 и при несравнении задает переход на выполнение команды 22.

По команде 9 также загружаются модификаторы, и после первого выполнения (при a10 = 0 ) будут справедливы равенства: (M7) = a00; (M8) = a00; (M9) = < l0 >.

По команде 10 начинается вложенный цикл на n - 1, ..., 1 повторений поиска уравнения, у которого старший коэффициент не равен нулю.

По команде 11 производится переход по условию; в первый раз при a10 = 0 — переход к выполнению команды 19.

Команда 12 начинает очередной вложенный цикл. В первый раз выполняются действия:

a00 => l0, a01 => l1 и т.д. (команда 13),

a10 => a00, a11 => a01 и т.д. (команда 14),

l0 => a10, l1 => a11 и т.д. (команда 15) — таким образом, уравнения меняются местами. Выполнение цикла заканчивается по команде 17.

После нахождения старшего ненулевого коэффициента и перестановки уравнений поиск заканчивается, поэтому команда 18 задает принудительный выход из предыдущего цикла.

Команда 19 позволяет произвести переход к анализу следующего уравнения.

Останов по команде 21 означает, что все старшие коэффициенты нулевые и поэтому нельзя построить треугольную матрицу с определителем, не равным нулю.

Команда 22 начинает цикл на n - 1, ..., 1 повторений преобразования уравнений. Команда 24, переход по сравнению, позволяет пропустить уравнение, у которого старший коэффициент равен нулю. Команда 25 коммутирует деление, последовательно задавая вычисление

r = \frac{a_{00}}{a_{10}},\,\frac{a_{00}}{a_{20}},\ldots

Команда 26 — начало вложенного цикла на n, n - 1, ..., 2 повторений преобразования коэффициентов одного уравнения. В первый раз по командам 27 и 28 будут закоммутированы вычисление и отсылка:

a_{11} \times \frac{a_{00}}{a_{10}} - a_{01} \Longrightarrow a_{11}.

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

Команда 33 в первый раз определяет переход от a00 к a11(1) ; по команде 34 происходит уменьшение граничных значений параметров циклов. Команда 35 — конец самого внешнего цикла, т.е. конец "прямого хода".

По командам 36 и 37 изменяется содержимое индексных регистров:

(M2) = <x0>,\, (l1) = (R2) = n - 1, (M2) = <xn-1>,

а команда 38 коммутирует выполнение операции деления

x_{n-1} = \frac{a_{n-1,n}}{a^{(n-1)}_{n-1,n-1}}

Команда 39 начинает цикл на n - 1 повторение, а команда 41 — вложенный цикл на n - 1, n - 2, ..., 1 повторение.

По командам 43 последовательно в каждой итерации цикла коммутируется выполнение умножения:

an-2, n-1 x xn-1, an-3, n-1 x xn-1 и т.д.,

а по команде 44 — вычитания: an-2,n-1 := an-2, n - an-2, n-1 x xn-1, an-3, n-1 := an-3, n - an-3, n-1 x xn-1 и т.д.

После этого вложенный цикл заканчивается (команда 45), и изменяются значения индексных регистров (команды 46 и 47), что дает возможность перейти к коммутации нахождения xn-2, xn-3 и т.д. (команда 48).

В первый раз

x_{n-2} = \frac{a_{n-2, n-1}}{a_{n-2, n-2}}.
Выполнение программы заканчивается по команде 49.

< Лекция 10 || Лекция 11: 12345 || Лекция 12 >
Вадим Козлов
Вадим Козлов
Россия, Москва
Тимофей Маханько
Тимофей Маханько
Россия