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

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

Метод Гаусса - класичний метод розв'язання системи лінійних алгебраїчних рівнянь (СЛАР). Розглянемо систему лінійних рівнянь з дійсними постійними коефіцієнтами:

або в матричної формі

Метод Гаусса рішення системи лінійних рівнянь включає в себе 2 стадії:

  • послідовне (пряме) виключення;
  • зворотна підстановка.

послідовне виключення

Винятки Гаусса засновані на ідеї послідовного виключення змінних по одній до тих пір, поки не залишиться тільки одне рівняння з однією змінною в лівій частині. Потім це рівняння вирішується щодо єдиної змінної. Таким чином, систему рівнянь призводять до трикутної (ступінчастою) формі. Для цього серед елементів першого стовпця матриці вибирають ненульовий (а частіше максимальний) елемент і переміщують його на крайнє верхнє положення перестановкою рядків. Потім нормують всі рівняння, розділивши його на коефіцієнт ai1. де i - номер стовпчика.

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

Потім віднімають вийшла після перестановки перший рядок з інших рядків:
Рішення систем лінійних рівнянь методом Гаусса

Отримують нову систему рівнянь, в якій замінені відповідні коефіцієнти.

Після того, як зазначені перетворення були здійснені, перший рядок і перший стовпець подумки викреслюють і продовжують вказаний процес для всіх наступних рівнянь поки не залишиться рівняння з однією невідомою:

Зворотній підстановка

Зворотній підстановка передбачає підстановку отриманого на попередньому кроці значення змінної xn в попередні рівняння:

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

Ця процедура повторюється для всіх, хто лишився рішень:
Рішення систем лінійних рівнянь методом Гаусса

ілюструє приклад

Нехай дана система рівнянь

або в матричної формі

Вибираємо рядок з максимальним коефіцієнтом ai1 і міняємо її з першої.

Нормуємо рівняння щодо коефіцієнта при x1:

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


Віднімаємо 1 рівняння з 2 і 3:

Вибираємо рядок з найбільшим коефіцієнтом при ai2 (рівняння 1 не розглядається) і переміщаємо її на місце 2.

Нормуємо 2 і 3 рівняння щодо коефіцієнта при x2


Віднімаємо рівняння 2 з 3

Нормуємо рівняння 3 щодо коефіцієнта при x3

Звідки отримуємо x3 = 2. Підставляємо отримане значення в рівняння 2 і 1 отримуємо

Підставляючи отримане значення x2 = 5 в рівняння 1, знайдемо

Таким чином, рішенням системи рівнянь буде вектор

Реалізація на C ++

#include
using namespace std;
// Висновок системи рівнянь
void sysout (double ** a, double * y, int n)
for (int i = 0; i for (int j = 0; j cout < if (j cout <<" + " ;
>
cout <<" = " <>
return;
>
double * gauss (double ** a, double * y, int n)
double * x, max;
int k, index;
const double eps = 0.00001; // точність
x = new double [n];
k = 0;
while (k // Пошук рядки з максимальним a [i] [k]
max = abs (a [k] [k]);
index = k;
for (int i = k + 1; i if (abs (a [i] [k])> max)
max = abs (a [i] [k]);
index = i;
>
>
// Перестановка рядків
if (max // нет ненульових діагональних елементів
cout <<"Решение получить невозможно из-за нулевого столбца " ;
cout < return 0;
>
for (int j = 0; j double temp = a [k] [j];
a [k] [j] = a [index] [j];
a [index] [j] = temp;
>
double temp = y [k];
y [k] = y [index];
y [index] = temp;
// Нормалізація рівнянь
for (int i = k; i double temp = a [i] [k];
if (abs (temp) for (int j = 0; j a [i] [j] = a [i] [j] / temp;
y [i] = y [i] / temp;
if (i == k) continue; // рівняння не вираховувати саме з себе
for (int j = 0; j a [i] [j] = a [i] [j] - a [k] [j];
y [i] = y [i] - y [k];
>
k ++;
>
// зворотна підстановка
for (k = n - 1; k> = 0; k--)
x [k] = y [k];
for (int i = 0; i y [i] = y [i] - a [i] [k] * x [k];
>
return x;
>
int main ()
double ** a, * y, * x;
int n;
system ( "chcp 1251");
system ( "cls");
cout <<"Введите количество уравнений: " ;
cin >> n;
a = new double * [n];
y = new double [n];
for (int i = 0; i a [i] = new double [n];
for (int j = 0; j cout <<"a[" <