Добавил:
ArGoN4ik
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 2lab
.cpp#include <locale>
#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;
const int n = 3;
// b V
double M[n][n + 1] = { {1, 0.11, 1, 1.388 },
{0.98, 1.006, 1.03, 2.1088},
{1, -0.18, 1, 1.156 } };
double determinant(double a[n][n+1], int X) //x=0 общий, x=1...3 перестановки
{
switch (X)
{
case 0:
return (a[0][0] * a[1][1] * a[2][2]) + (a[0][1] * a[1][2] * a[2][0]) + (a[0][2] * a[1][0] * a[2][1]) -
(a[0][2] * a[1][1] * a[2][1]) - (a[0][0] * a[1][2] * a[2][1]) - (a[0][1] * a[1][0] * a[2][2]);
break;
case 1:
return (a[0][3] * a[1][1] * a[2][2]) + (a[0][1] * a[1][2] * a[2][3]) + (a[0][2] * a[1][3] * a[2][1]) -
(a[0][2] * a[1][1] * a[2][3]) - (a[0][3] * a[1][2] * a[2][1]) - (a[0][1] * a[1][3] * a[2][2]);
break;
case 2:
return (a[0][0] * a[1][3] * a[2][2]) + (a[0][3] * a[1][2] * a[2][0]) + (a[0][2] * a[1][0] * a[2][3]) -
(a[0][2] * a[1][3] * a[2][1]) - (a[0][0] * a[1][2] * a[2][3]) - (a[0][3] * a[1][0] * a[2][2]);
break;
case 3:
return (a[0][0] * a[1][1] * a[2][3]) + (a[0][1] * a[1][3] * a[2][0]) + (a[0][3] * a[1][0] * a[2][1]) -
(a[0][3] * a[1][1] * a[2][1]) - (a[0][0] * a[1][3] * a[2][1]) - (a[0][1] * a[1][0] * a[2][3]);
break;
default:
throw 444;
return 0;
break;
}
}
void Kramer(double A[n][n + 1])
{
double x[n];
for (int i = 0; i < n; i++)
{
x[i] = determinant(A, i+1) / determinant(A, 0);
}
cout << "Решение системы:" << endl;
for (int i = 0; i < n; i++)
{
cout << "x[" << i + 1 << "] = ";
printf("%.5lf", x[i]);
cout << endl;
}
cout << "Проверка" << endl;
for (int i = 0; i < n; i++)
{
double c = 0;
for (int j = 0; j < n; j++)
{
c += x[j] * M[i][j];
}
printf("%.5lf", abs(c - M[i][n]));
cout << endl;
}
}
void Gauss(double a[n][n + 1])
{
int i, j, m, k;
double aa, bb;
double* x = new double[n];
for (k = 0; k < n; k++)
{
aa = abs(a[k][k]);
i = k;
for (m = k + 1; m < n; m++)
if (abs(a[m][k]) > aa)
{
i = m;
aa = abs(a[m][k]);
}
if (aa == 0)
{
cout << "Система не имеет решений" << endl;
}
if (i != k)
{
for (j = k; j <= n + 1; j++)
{
swap(a[i][j], a[k][j]);
}
}
aa = a[k][k];
a[k][k] = 1;
for (j = k + 1; j <= n + 1; j++)
a[k][j] = a[k][j] / aa;
for (i = k + 1; i < n; i++)
{
bb = a[i][k];
a[i][k] = 0;
if (bb != 0)
for (j = k + 1; j <= n + 1; j++)
a[i][j] = a[i][j] - bb * a[k][j];
}
}
for (i = n - 1; i >= 0; i--)
{
x[i] = 0;
aa = a[i][n];
for (j = n - 1; j >= i; j--)
aa = aa - a[i][j] * x[j];
x[i] = aa;
}
cout << "Решение системы:" << endl;
for (i = 0; i < n; i++)
{
cout << "x[" << i + 1 << "] = ";
printf("%.5lf", x[i]);
cout << endl;
}
cout << "Проверка" << endl;
for (i = 0; i < n; i++)
{
double c = 0;
for (j = 0; j < n; j++)
{
c += x[j] * M[i][j];
}
printf("%.5lf", abs(c - M[i][n]));
cout << endl;
}
}
int main()
{
setlocale(LC_ALL, "Russian");
cout << "Метод Гауса: " << endl;
Gauss(M);
cout << endl << "Метод Крамера: " << endl;
Kramer(M);
system("pause");
return 0;
}