You are on page 1of 11

Міністерство освіти і науки

Національний університет «Львівська політехніка»


Інститут комп’ютерних наук та інформаційних технологій
Кафедра автоматизованих систем управління

Лабораторна робота №3
з дисципліни «Чисельні методи»
на тему: «Розв’язування системи лінійних алгебраїчних
рівнянь методом Гауса. Схема Жордана»

Виконав:
Перевірив:

Львів 2019
Лабораторна робота №3
Тема: Розв’язування системи лінійних алгебраїчних рівнянь методом
Гауса. Схема Жордана.
Мета роботи: вивчити і засвоїти Методи Гауса і Жордана – Гауса розв’язування
СЛАР.
1.1 Порядок роботи:
1. Попереднє опрацювання теоретичного матеріалу.

2. Отримання допуску до виконання лабораторної роботи.

3. Опрацювання типового навчального завдання (прикладів).

4. Створення проекту для виконання індивідуального завдання.

5. Оформити звіт для захисту лабораторної роботи за зразком:

 назва роботи;

 мета роботи;

 короткі теоретичні відомості;

 алгоритм розв’язування задачі;

 тексти відповідних модулів проекту;

 аналіз отриманих результатів та висновки.

6. Захист лабораторної роботи.

1.2 Короткі теоретичні відомості

Нехай задана система п лінійних рівнянь із п невідомими, яка в


матричному записі має вигляд

Ax=b , причому коефіцієнтами матриці A є {aij } ,1≤i, j≤n , b=( b1 , . .. , bn ) . x=( x1 ,. .. , x n )


(1) –
шуканий вектор – розв’язок із відповідними компонентами.

Метод Гауса полягає в зведенні квадратної системи (1) до трикутного


вигляду з використан-ням алгоритму послідовного виключення невідомих.

Алгоритм методу Гауса складається з двох етапів:

1. Триангуляція матриці
a(ijk +1)=a(kik )−a(kjk )/a(kkk ) , k=1 , n−1 , i=k +1 , n , j=k ,n+1 . (2)

2. Обчислення розв’язку системи рівнянь


n
x i=
( a(i i), n+1 − ∑
j=i +1
)
a(iji) x j /a(iii) , i=n , n−1, .. . , 1.
(3)

Модифікацією методу Гауса є метод Жордана-Гауса (схема Жордана), що


полягає в наступному: в матриці А вибираємо відмінний від нуля елемент aij ,
який називають її провідним елементом (l-тий стовпець – провідним стовпцем,
а k-тий рядок – провідним рядком). СЛАР (1) перетворюють так, щоб
коефіцієнти при невідомих і вільні члени визначалися за наступними
формулами:
a il⋅a kj ail⋅bk
a'ij =aij − ;b'i =bi − ;ail =0 , якщо i≠k ,
a kl a kl
a'ki=a kj ;b 'k =bk , якщо i=k . (4)

Тобто, коефіцієнти при x l в усіх рівняннях СЛАР, крім k-го,


дорівнюватимуть нулю. Подібно до цього перетворюють СЛАР на наступному
'
кроці, прийнявши за провідний елемент a sr ≠0 , де s≠k , r ≠l . Після цього
перетворення всі коефіцієнти при x r , крім a sr дорівнюють нулю і т.д. Таким
чином отримаємо СЛАР у вигляді таблиці, з якої знаходимо значення всіх
невідомих. Наприклад, для СЛАР із трьох рівнянь матимемо:
1 0 0 d1 x 1=d1
0 1 0 d2 x 2=d 2
0 0 1 d3 ⇒ x 3=d 3 .

2.1 Хід роботи

Завдання: наступну СЛР розв’язати методом Гауса

( 1+k ) x 1 + 2 x 2 +3 x 3 −2 x 4 =6
2 x 1 −kx 2 −2 x 3 −3 x 4 =8( 1− k )
3 x 1 +2 x2 − εx 3 +( 2−k ) x 4 = 4 k
2 x 1 −3 x 2 +2 x 3 + x 4 =−8 (1+3 k )
¿
{¿ {¿ {¿ ¿ ¿
¿

де k=0,01·n, n – номер варіанту, що дорівнює порядковому номеру студента в


списку групи,, ε=0,1.
Підстановкою знайдених значень визначити похибку обчислень. Привести
таблицю та графік зміни похибки для зміни ε від значення 0,1 до значення 10-10.

Варіант 13
k = 0.01 * 13 = 0.13

1.13x1 + 2x2 + 3x3 - 2x4 = 6

2x1 - 0.13x2 - 3x4 = 6.96

3x1 + 2x2 - 0.1x3 + 1.87x4 = 0.52

2x1 - 3x2 + 2x3 + x4 = -11.12

2.2 Метод Гауса:

Напишемо систему у вигляді розширеної матриці:

1.13 2 3 -2 6

2 -0.13 -2 -3 6.96

3 2 -0.1 1.87 0.52

2 -3 2 1 -11.12

1-ий рядок помножити на -1.76 і додати до 2 рядка;

1-ий рядок помножити на -2.65 і додати до 3 рядка

1-ий рядок помножити на -1.76 і додати до 4 рядка

1.13 2 3 -2 6

0 -3.66 -7.3 0.53 -3.65


0 -3.3 -8.06 7.17 -15.4

0 -6.53 -3.3 4.53 -21.73

2-ий рядок помножити на -0.9 і додати до 3 рядка;

2-ий рядок помножити на -1.78 і додати до 4 рядка;


1.13 2 3 -2 6

0 -3.66 -7.3 0.53 -3.65


0 0 -1.47 6.69 -12.1

0 0 9.71 3.57 -15.21

3-ий рядок помножити на 6.6 і додати до 4 рядка;

1.13 2 3 -2 6

0 -3.66 -7.3 0.53 -3.65


0 0 -1.47 6.69 -12.1
0 0 0 47.75 -95.14

Ділимо 1 рядок на 1.13;

Ділимо 2 рядок на -3.66;

Ділимо 3 рядок на -1.47;

Ділимо 4 рядок на 47.75;

1 1.76 2.65 -1.76 5.3

0 1 1.99 -0.14 0.99


0 0 1 -4.54 8.22

0 0 0 1 -1.99

Отримаємо:

х1 = -0.18

х2 = 2.36

х3 = -0.83

х4 = -1.99

2.3 Метод Жордана-Гауса:


Напишемо систему у вигляді розширеної матриці:

Перетворимо всі елементи 1 стовпчика , окрім а1,1 , на нулі. Для цього до 2, 3, 4


рядку додамо 1, помножений на −1.769,−2.654,−1.769

Перетворимо всі елементи 2 стовпчика , окрім а2,2, на нулі. Для цього до 3, 4


рядку додамо 2, помножений на −0.901,−1.782

Перетворимо всі елементи 3 стовпчика ,окрім а3,3 , на нулі. Для цього 4 рядку
додамо 3, помножений на 6.6

Перетворимо всі елементи 4 стовпчика , окрім а4,4, на нулі. Для цього до 1, 2, 3


рядку додамо 4, помножений на 0.041, −0.011, −0.14
Перетворимо всі елементи 3 стовпчика , окрім а3,3, на нулі. Для цього до 1, 2
рядку додамо 3, помножений на 2.037, −4.965

Перетворимо всі елементи 2 стовпчика , окрім а2,2, на нулі. Для цього до 1 рядку
додамо 2, помножений на 0.544

Ділимо кожну стрічку матриці на відповідний ведучий елемент

Результат:

2.4 Код програми


#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
#define N 4
#define N1 5

using namespace std;

void task(double m[4][5], double* x1, double* x2, double* x3, double* x4);

double matrix[N][N1] = { { 1.13, 2, 3, -2, 6},


{ 2, -0.13, -2, -3 , 6.96},
{ 3, 2, -0.1, 1.87, 0.52},
{ 2, -3 , 2, 1, -11.12} };
float epsilon = 0.001;

void ShowMatrix(void)
{
cout << "Рiвняння:" << endl;
int i, j;
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
printf("%+3.3f*x%d", matrix[i][j], i + 1);
printf("=%3.3f\n", matrix[i][N]);
}
}

int main(int argc, const char * argv[]) {


system("chcp 1251");
system("color F0");
puts("Лабораторна робота №3");
puts("Тема: Розв’язування системи лінійних алгебраїчних рівнянь методом
Жордана-Гауса та Гауса");
puts("Виконав студент групи КН-201");
puts("Мельник Тарас");
a1:
int choise;
puts(" ");
puts("1.Метод Жордана-Гауса;");
puts("2.Метод Гауса;");
puts("3.Вихід;");
puts("Ваш вибір: ");
cin >> choise;
while (choise < 3) {

if (choise == 1)
{

double matr[4][5] =
{
{ 1.13, 2, 3, -2, 6},
{ 2, -0.13, -2, -3 , 6.96},
{ 3, 2, -0.1, 1.87, 0.52},
{ 2, -3 , 2, 1, -11.12}
};
puts("Моя матриця:"); //вивід моєї матриці
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
printf("%.2lf\t", matr[i][j]);
}
puts("");
}
puts("");
puts("Розв’язок:"); //виводимо розв’язки
double x1, x2, x3, x4;
task(matr, &x1, &x2, &x3, &x4); //функція, яка знаходить
розв’язки
/*printf("x1=%lf\nx2=%lf\nx3=%lf\nx4=%lf\n", x1, x2, x3, x4);*/

}
else if (choise == 2)
{
float tmp, xx[N1];
short int i, j, k;

ShowMatrix();

/*Метод Гауса*/
/*прямий хід*/
for (i = 0; i < N; i++)
{
tmp = matrix[i][i];
for (j = N; j >= i; j--)
matrix[i][j] /= tmp;
for (j = i + 1; j < N; j++)
{
tmp = matrix[j][i];
for (k = N; k >= i; k--)
matrix[j][k] -= tmp * matrix[i][k];
}
}
/*зворотній хід*/
xx[N - 1] = matrix[N - 1][N];
for (i = N - 2; i >= 0; i--)
{
xx[i] = matrix[i][N];
for (j = i + 1; j < N; j++) xx[i] -= matrix[i][j] * xx[j];
}
/*вивід рішення*/
printf("\nРозв`язок :\n");
for (i = 0; i < N; i++)
printf("x%d=%3.3f\n", i + 1, xx[i]);

}
puts(" ");
puts("1.Метод Жордана-Гауса;");
puts("2.Метод Гауса;");
puts("3.Вихід;");
puts("Ваш вибір: ");
cin >> choise;
puts(" ");
}
return 0;
}

void task(double m[4][5], double* x1, double* x2, double* x3, double* x4) {
for (int j = 0; j < 4; j++) {
puts("");
double in_mind = m[j][j];
for (int i = 0; i < 5; i++)
m[j][i] /= in_mind;
for (int i = 0; i < 4; i++) {
if (i == j)
continue;
double in_mind2 = m[i][j];
for (int k = 0; k < 5; k++)
m[i][k] = m[i][k] - (m[j][k] * in_mind2);
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
printf("%.2lf\t", m[i][j]);
}
puts("");
}
}
puts("");
*x1 = m[0][4];
*x2 = m[1][4]; *x3 = m[2][4];
*x4 = m[3][4];
cout << ("Результат:\nx1 = ") << *x1 << endl << "x2 = " << *x2 << endl << "x3
= " << *x3 << endl << "x4 = " << *x4 << endl;

2.5 Результат програми


2.7 Висновок

Виконавши цю лабораторну роботу, я вивчив і засвоїв Методи Гауса і Жордана –


Гауса розв’язування СЛАР. Для легкого обчислення я використовував Microsoft
Excel, а також написав програму на С++ у Visual Studio. Результати, обчислені
вручну та програмно збігаються.

You might also like