Professional Documents
Culture Documents
3
3
Лабораторна робота №3
з дисципліни «Чисельні методи»
на тему: «Розв’язування системи лінійних алгебраїчних
рівнянь методом Гауса. Схема Жордана»
Виконав:
Перевірив:
Львів 2019
Лабораторна робота №3
Тема: Розв’язування системи лінійних алгебраїчних рівнянь методом
Гауса. Схема Жордана.
Мета роботи: вивчити і засвоїти Методи Гауса і Жордана – Гауса розв’язування
СЛАР.
1.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)
( 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 )
¿
{¿ {¿ {¿ ¿ ¿
¿
Варіант 13
k = 0.01 * 13 = 0.13
1.13 2 3 -2 6
2 -0.13 -2 -3 6.96
2 -3 2 1 -11.12
1.13 2 3 -2 6
1.13 2 3 -2 6
0 0 0 1 -1.99
Отримаємо:
х1 = -0.18
х2 = 2.36
х3 = -0.83
х4 = -1.99
Перетворимо всі елементи 3 стовпчика ,окрім а3,3 , на нулі. Для цього 4 рядку
додамо 3, помножений на 6.6
Перетворимо всі елементи 2 стовпчика , окрім а2,2, на нулі. Для цього до 1 рядку
додамо 2, помножений на 0.544
Результат:
void task(double m[4][5], double* x1, double* x2, double* x3, double* x4);
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]);
}
}
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;