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

Метод Гаусса онлайн

Данный онлайн калькулятор находит решение системы линейных уравнений (СЛУ) методом Гаусса. Дается подробное решение. Для вычисления выбирайте количество переменных и количество уравнений. Затем введите данные в ячейки и нажимайте на кнопку «Вычислить.»

Предупреждение

Инструкция ввода данных. Числа вводятся в виде целых чисел (примеры: 487, 5, -7623 и т.д.), десятичных чисел (напр. 67., 102.54 и т.д.) или дробей. Дробь нужно набирать в виде a/b, где a и b (b>0) целые или десятичные числа. Примеры 45/5, 6.6/76.4, -7/6.7 и т.д.

Метод Гаусса

Метод Гаусса − это метод перехода от исходной системы линейных уравнений (при помощи эквивалентных преобразований) к системе, которая решается проще, чем исходная система.

Эквивалентными преобразованиями системы линейных уравнений являются:

  • перемена местами двух уравнений в системе,
  • умножение какого-либо уравнения в системе на ненулевое действительное число,
  • прибавление к одному уравнению другого уравнения, умноженного на произвольное число.

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

(1)

Запишем систему (1) в матричном виде:

Ax=b(2)
(3)

A-называется матрица коэффициентов системы, b − правая часть ограничений, x− вектор переменных, которую нужно найти. Пусть rang(A)=p.

Эквивалентные преобразования не меняют ранг матрицы коэффициентов и ранг расширеннной матрицы системы. Не меняется также множество решений системы при эквивалентных преобразованиях. Суть метода Гаусса заключается в приведении матрцы коэффициентов A к диагональному или ступенчатому.

Построим расшренную матрицу системы:

(4)

Предположим a11≠0. Если это не так, то можно поменять местами эту строку со строкой с ненулевым элементом в столбце 1 (если нет таких строк, то переходим к следующему столбцу). Обнуляем все элементы столбца 1 ниже ведущего элемента a11. Для этого сложим строки 2,3, . m со строкой 1, умноженной на −a21/a11, −a31/a11, . −am1/a11, соответственно. Тогда (4) примет следующий вид:

(5)

На следующем этапе обнуляем все элементы столбца 2, ниже элемента . Если данный элемент нулевой, то эту строку меняем местами со строкой, лежащий ниже данной строки и имеющий ненулевой элемент во втором столбце. Далее обнуляем все элементы столбца 2 ниже ведущего элемента a22. Для этого сложим строки 3, . m со строкой 2, умноженной на −a32/a22, . −am2/a22, соответственно. Продолжая процедуру, получим матрицу диагонального или ступенчатого вида. Пусть полученная расширенная матрица имеет вид:

(6)

Обратим внимание на последние строки. Если . равны нулю, то система линейных уравнений имеет решение, если же хотя бы один из этих чисел отлично от нуля, то система несовместна. Иными словами, система (2) совместна тогда и только тогда, когда ранг матрицы A навен рангу расширенной матрицы (A|b).

Пусть . Тогда

(7)

Так как rangA=rang(A|b), то множество решений (7) есть (n−p)− многообразие. Следовательно n−p неизвестных можно выбрать произвольно. Остальные неизвестные из системы (7) вычисляются так. Из последнего уравнения выражаем xp через остальные переменные и вставляем в предыдущие выражения. Далее из предпоследнего уравнения выражаем xp−1 через остальные переменные и вставляем в предыдущие выражения и т.д. Рассмотрим метод Гаусса на конкретных примерах.

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

Пример 1. Найти общее решение системы линейных уравнений методом Гаусса:

Матричный вид записи: Ax=b, где

Для решения системы, запишем расширенную матрицу:

Обозначим через aij элементы i-ой строки и j-ого столбца.

Исключим элементы 1-го столбца матрицы ниже элемента a1 1. Для этого сложим строки 2,3 со строкой 1, умноженной на -2/3,-1/2 соответственно:

Исключим элементы 2-го столбца матрицы ниже элемента a2 2. Для этого сложим строку 3 со строкой 2, умноженной на 9/8:

Делим каждую строку матрицы на соответствующий ведущий элемент (если ведущий элемент существует):

Из вышеизложенной таблицы можно записать:

Подставив верхние выражения в нижние, получим решение.

,,.

Пример 2. Найти общее решение системы линейных уравнений методом Гаусса:

Матричный вид записи: Ax=b, где

Для решения системы, построим расширенную матрицу:

Обозначим через aij элементы i-ой строки и j-ого столбца.

Исключим элементы 1-го столбца матрицы ниже элемента a11. Для этого сложим строки 2,3 со строкой 1, умноженной на -1/5,-6/5 соответственно:

Исключим элементы 2-го столбца матрицы ниже элемента a22. Для этого сложим строку 3 со строкой 2, умноженной на -1:

Делим каждую строку матрицы на соответствующий ведущий элемент (если ведущий элемент существует):

Выразим переменные x1, x2 относительно остальных переменных.

где x3, x4− произвольные действительные числа.

Подставив верхние выражения в нижние, получим решение.

где x3, x4− произвольные действительные числа.

Векторный вариант решения:

Запишем вышеизложенное решение, представив свободные переменные в виде тождеств:

Тогда векторное решение можно представить так:

где x3, x4− произвольные действительные числа.

Метод Гаусса на Java

Статья посвящена реализации алгоритма Гаусса для решения системы линейных алгебраических уравнений на языке Java.

Теоретические сведения

Рассмотрим математическую теорию. Система линейных уравнений может иметь одно решение, бесконечно много решений или же быть несовместной (не иметь решений). Не все методы решения СЛАУ могут справится с вторым случаем, когда система имеет бесконечно много решений. Например, метод Крамера и матричный метод не применимы, но метод Гаусса вполне можно использовать.

Алгоритм можно условно разделить на два этапа:

  • Прямой ход
  • Обратный ход

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

Реализация

Начнем с постановки задачи:

  • нам нужно создать программу, реализующую систему линейных уравнений в виде некоторой структуры данных, используя приемы обобщенного программирования. Система должна содержать коэффициенты производного типа от класса Number (т.е. Float, Integer, Double и т.д.)
  • Запрограммировать алгоритм, который получив на вход структуру данных системы образует нули ниже главной диагонали

Начнем с написания интерфейса, который должно реализовывать каждое уравнение:

Здесь все должно быть ясно, N некоторый наследник Number‘а, T — некоторый тип, реализующий данный интерфейс (рекурсивные дженерики). Метод addEquation(T item) позволяет прибавить каждый элемент уравнения item к каждому своему элементу. Остальные методы работают аналогично.

Теперь рассмотрим класс системы уравнений. Как видно в листинге ниже, он дженеризирован так же, как и интерфейс Gauss и содержит методы для удобного доступа к приватному списку содержащих в себе уравнений.

Теперь можно приступать к реализации «частного случая» структуры уравнения. Создадим класс MyEquation, реализующий наш интерфейс. Пусть наследником Number‘а будет сверхточный класс Float (на практике лучше брать Double). Обратите внимание, что в методе addEquation(MyEquation item) используется объект класса ListIterator, позволяющий изменять элементы перебираемого списка.

Теперь имеем полноценную структуру данных, реализующую систему уравнений. Составим алгоритм который будет принимать некоторый объект, реализующий интерфейс Gauss, затем вызывая нужные методы приведет матрицу к нужному виду.

Алгоритм простой, найти нужный коэффициент, домножить на него i-ю строку (i=0..n-1), и прибавить ее к j-й строке (j=i..n). Заметьте, алгоритм не знает как именно реализуются методы findCoefficient, mul и addEquation, это придает коду бОльшую гибкость, т.к. при потребности изменить способы манипуляции уравнениями (строками), будут изменены только реализации трех вышеупомянутых методов, а главный алгоритм останется нетронутым.

Почти все. Осталось запустить это все в методе main:

Запустим это чудо, что бы проверить корректность работы…

Это все. Исходники можно скачать на github’е.

Вывод

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

Программная реализация метода Гаусса

Вычислительная схема метода Гаусса состоит из двух этапов. Первый этап заключается в приведении системы к трапециевидной. Этот этап называется прямым ходом. Второй этап — определение неизвестных — называется обратным ходом.

Прямой ход метода Гаусса состоит в последовательном исключении коэффициентов при неизвестных начиная с первого столбца.

Прямой ход реализуется по следующим формулам (индекс k в круглых скобках означает номер цикла — номер столбца).

Умножение k-й строки на число

. (1)

Вычитание k-й строки из j-й строки

. (2)

. (3)

Обратный ход — вычисление неизвестных — реализуется по следующим формулам, начиная с последнего уравнения системы

. (4)

Код C++

using namespace std;

cout «Poryadok: » > n;

double **a = new double *[n];

for (i = 0; i new double [n];

double **a1 = new double *[n];

for (i = 0; i new double [n];

double *b = new double [n];

double *x = new double [n];

cout «Vvedite koefficienty i svobodnye chleny » for (i = 1; i for (j = 1; j «a[ » «,» «]= » ;

for (k = 1; k // прямой ход

for (j = k + 1; j // формула (1)

for (i = k; i // формула (2)

b[j] = b[j] — d * b[k]; // формула (3)

for (k = n; k >= 1; k—) // обратный ход

for (j = k + 1; j // формула (4)

d = d + s; // формула (4)

x[k] = (b[k] — d) / a[k][k]; // формула (4)

cout «Korni sistemy: » for ( i = 1; i «x[» «]=» » » return 0;


источники:

http://habr.com/ru/post/270289/

http://function-x.ru/cpp_metod_gaussa.html