Найти в Дзене
Андрей Куликов

Решение СЛАУ методом Гаусса

(Решение СЛАУ упрощённым методом Гаусса описано в статье [4].) В зависимости от того, к какому треугольному виду из четырёх приводится матрица СЛАУ, метод Гаусса имеет четыре разновидности: Right-Upper (традиционная), Left-Lower, Left-Upper и Right-Lower, причём правые (с вычислением корней "задом-наперёд") - не упрощённые, а левые (с вычислением корней в естественном прямом порядке) - упрощённые. В данной статье описываются только не упрощённые (правые) разновидности метода Гаусса: Right-Upper и Right-Lower. В справочнике Дьяконова [1], в параграфе 4.1, приведено небольшое описание решения СЛАУ простейшим методом последовательного исключения неизвестных (Гаусса) и приведена программа 4.1 на Бэйсике для карманного компьютера CASIO FX-702P, доступном только для немногих владельцев этого карманного компьютера. В данной статье приведён перевод программы 4.1 из справочника Дьяконова с Бэйсика для CASIO FX-702P на Borland Turbo Basic, на С, на C++, на Python и на Pascal, доступные в интерне
Оглавление

(Решение СЛАУ упрощённым методом Гаусса описано в статье [4].)

В зависимости от того, к какому треугольному виду из четырёх приводится матрица СЛАУ, метод Гаусса имеет четыре разновидности: Right-Upper (традиционная), Left-Lower, Left-Upper и Right-Lower, причём правые (с вычислением корней "задом-наперёд") - не упрощённые, а левые (с вычислением корней в естественном прямом порядке) - упрощённые. В данной статье описываются только не упрощённые (правые) разновидности метода Гаусса: Right-Upper и Right-Lower.

В справочнике Дьяконова [1], в параграфе 4.1, приведено небольшое описание решения СЛАУ простейшим методом последовательного исключения неизвестных (Гаусса) и приведена программа 4.1 на Бэйсике для карманного компьютера CASIO FX-702P, доступном только для немногих владельцев этого карманного компьютера. В данной статье приведён перевод программы 4.1 из справочника Дьяконова с Бэйсика для CASIO FX-702P на Borland Turbo Basic, на С, на C++, на Python и на Pascal, доступные в интернете для многих.

В переводе есть несколько небольших отличий от оригинала:

1. Количество уравнений N и матрица СЛАУ вводится не с клавиатуры, а прямо в текст программы в операторах DATA, неактивные контрольные примеры при этом отключаются операторами комментариев ('). СЛАУ вводятся в виде расширенной матрицы (A|b), состоящей из квадратной матрицы коэффициентов СЛАУ A и присоединённого к ней вектора-столбца свободных членов b.

2. Расширенные матрицы СЛАУ выводятся на экран функцией FN MATOUT.

3. Коэффициенты A[J,I]/A[I,I] записываются не в освободившиеся ячейки матрицы A[J,I], а в переменную H, что увеличивает быстродействие программы, так как обращение к переменной быстрее, чем обращение к элементам двумерного массива.

В очень редких случаях, когда в дальнейших вычислениях требуются обнулённые элементы матрицы, после вычисления коэффициентов H можно вставить строку обнуления A[J,I]=0, которая записывает в матрицу обнулённые, но не записанные в матрицу элементы, без их действительного вычисления, что немного быстрее, чем действительное вычисление обнуляемых элементов.

4. В блоке приведения матрицы СЛАУ к правому верхнему (Right-Upper) треугольному виду, для большей наглядности, добавлена строка записи в матрицу и обнулённых элементов: FOR K=1 TO N. Для увеличения быстродействия её нужно отключить и снять отключение с оригинальной строки.

Для увеличения быстродействия элементы матрицы в столбцах, обнулённые в предыдущих проходах, из вычислений в последующих проходах исключаются.

5. Вместо перемены знака коэффициентов и сложения применено вычитание с коэффициентами с исходными знаками.

6. Для измерения быстродействия разных блоков программы в микросекундах (usec) добавлен микротаймер с помощью оператора MTIMER.

7. Для упорядочивания вычисления суммы в блоке вычисления корней цикл FOR J=I+1 TO N заменён на цикл FOR J=N TO I+1 STEP -1.

8. Для проверки правильности вычисленных корней СЛАУ добавлено вычисление вектор-столбца свободных членов по формуле: b=A*x. При правильном решении СЛАУ вычисленный вектор-столбец свободных членов должен совпадать с исходным.

По измерениям в Borland TurboBasic'е с отключенными операторами обнуления, вычисления определителя матрицы, вывода на экран и без обмена строк:

система из 3-х уравнений решается приблизительно за 26-21 usec,

система из 4-х уравнений решается приблизительно за 47-42 usec.

Время приведения матрицы СЛАУ из 4-х уравнений к треугольному виду, по измерениям в TurboBasic'е, около 41-38 мксек.

9. В версии программы GRUS.BAS (Gauss, Right-Upper, Swap) добавлен блок SWAP/END SWAP делающий обмен строк, если по ходу приведения матрицы СЛАУ к треугольному виду на активной диагонали (в случае Right-Upper - на главной диагонали) встречается элемент с нулевым значением. Строка с нулевым значением обменивается на первую строку с не нулевым значением в этой же колонке из следующих строк. В программах по этому алгоритму не требуется условие A[I,I]<>0, они работают и при A[I,I]=0.

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

Блок SWAP/END SWAP, в случае с обменом строк, уменьшает быстродействие программы, но немного увеличивает множество решаемых СЛАУ. Если СЛАУ решается без обмена строк, то в нём нет нужды и его можно удалить из программы вовсе.

Время приведения матрицы СЛАУ из 4-х уравнений без обмена строк к треугольному виду, по измерениям в TurboBasic'е, около 44-40 мксек.

Время приведения матрицы СЛАУ из 4-х уравнений с двумя обменами строк к треугольному виду, по измерениям в TurboBasic'е, около 203 мксек. За меньшее время можно попробовать привести матрицу СЛАУ к треугольному виду всеми четырьмя разновидностями метода Гаусса (Right-Upper, Left-Lower, Left-Upper и Right-Lower).

10. В версии программы GRUSI.BAS (Gauss, Right-Upper, Swap, Index) действительные обмены строк заменены на обмены только номеров элементов (индексов) матрицы СЛАУ, действительные же элементы матрицы при этом остаются в матрице СЛАУ на прежних местах (строках). Из-за обращения к элементам одномерных массивов с индексами, а не к перемнным с индексами время решения СЛАУ немного увеличивается.

Время приведения матрицы СЛАУ из 4-х уравнений с двумя обменами строк к треугольному виду, по измерениям в TurboBasic'е, около 230 мксек.

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

1. Программа 4-1RU.BAS на Borland Turbo Basic'е:

-2
-3

Учебное наглядное пособие 4-1RUDEM.EXE (исходник: 4-1RUDEM.BAS) для изучающих решение СЛАУ методом последовательного исключения неизвестных (Гаусса) Right-Lower, показывающее последовательность вычислений:

-4

1.2. Программа 4-1RL.BAS на Borland TurboBasic'е:

В отличие от традиционного приведения матрицы СЛАУ к правому верхнему (Right-Upper) виду в программе 4-1RL.BAS матрица СЛАУ приводится к правому нижнему (Right-Lower) треугольному виду, что может оказаться полезным для решения некоторых СЛАУ, которые не решаются традиционным способом. При этом определитель вычисляется не по главной, а по побочной диагонали, который отличается от определителя вычисляемого по главной диагонали.

-5
-6
-7

Рис.1.2. Снимок с экрана результата прогона программы 4-1RL.BAS в Borland TurboBasic'е.

На снимке видно, что после преобразования матрица СЛАУ действительно стала правой нижней (Right-Lower) треугольной.

Наглядное пособие 4-1RLDEM.EXE (исходник: 4-1RLDEM.BAS) для изучающих решение СЛАУ методом последовательного исключения неизвестных (Гаусса) Right-Lower, показывающее последовательность вычислений:

-8

1.3. Программа GRUS.BAS на Borland TurboBasic'е:

-9
-10
-11

Рис.1.3. Снимок с экрана результата прогона программы GRUS.BAS в Borland TurboBasic'е.

Рис.1. Снимок с экрана результата прогона программы 4-1RU.BAS в Borland TurboBasic'е.

На снимке видно, что после преобразования матрица СЛАУ действительно стала правой верхней треугольной.

Наглядное пособие 4-1RUDEM.EXE (исходник: 4-1RUDEM.BAS) для изучающих решение СЛАУ методом последовательного исключения неизвестных (Гаусса) Right-Upper, показывающее последовательность вычислений:

На снимке видно, что после преобразования матрица СЛАУ действительно стала правой верхней (Right-Upper) треугольной.

Наглядное пособие GRUSDEM.EXE (исходник: GRUSDEM.BAS) для изучающих решение СЛАУ методом последовательного исключения неизвестных (Гаусса) Right-Upper, показывающее последовательность вычислений:

-12

1.4. Программа GRUSI.BAS на Borland TurboBasic'е:

-13
-14
-15

Рис.1.4. Снимок с экрана результата прогона программы GRUSI.BAS в Borland TurboBasic'е.

На снимке видно, что после преобразования матрица СЛАУ действительно стала правой верхней (Right-Upper) треугольной.

Наглядное пособие GRUSIDEM.EXE (исходник: GRUSIDEM.BAS) для изучающих решение СЛАУ методом последовательного исключения неизвестных (Гаусса) Right-Upper, показывающее последовательность вычислений:

-16

2. Программа 4-1RU.C на C:

-17
-18
-19

Рис.2. Снимок с экрана результата прогона программы 4-1RU.C в компиляторе Tiny C.

На снимке видно, что после преобразования матрица СЛАУ действительно стала правой верхней треугольной.

3. Программа 4-1RU.cpp на C++:

-20
-21
-22

Рис.3. Снимок с экрана результата прогона программы 4-1RU.cpp в компиляторе Borland C++ Compiller 5.5 в IDE Code::Blocks 17.12.

4. Программа 4-1RU.py на Python'е:

-23
-24

Рис.4. Снимок с экрана результата прогона программы 4-1RU.py в онлайн-компиляторе Python на странице https://ishaanbhimwal.github.io/online-python-compiler/

На снимке можно убедиться, что матрица СЛАУ действительно стала правой верхней треугольной.

5. Программа 4-1RU.PAS на Turbo Pascal'е:

-25
-26
-27

Рис.5. Снимок с экрана результата прогона программы 4-1RU.PAS в компиляторе Turbo Pascal 5.5.

В статье [4] описан упрощённый метод Гаусса, в котором корни в вектор-строке корней вычисляются и выводятся не "задом наперёд" от X[N] до X[1], а в естественном прямом порядке от X[1] до X[N].

Литература:

1. Д ь я к о н о в В. П. Справочник по алгоритмам и программам на языке бейсик для персональных ЭВМ: Справочник. — М.: Наука. гл. ред. физ.-мат. лит., 1989. — 240 с. — ISBN 5-02-014530-0. Файл: diakonovvp8.djvu

2. Система линейных алгебраических уравнений. Википедия.

3. Метод Гаусса. Википедия.

4. Решение СЛАУ упрощённым методом Гаусса. Куликов А. С.

Приложения:

1. Программа 4-1RU.BAS

1.2. Программа 4-1RL.BAS

1.3. Программа GRUS.BAS

1.4. Программа GRUSI.BAS

2. Программа 4-1RU.C

3. Программа 4-1RU.cpp

4. Программа 4-1RU.py

5. Программа 4-1RU.PAS

Версия 2025.10.26, исправленная и дополненная.