Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / 2lab

.cpp
Скачиваний:
1
Добавлен:
26.01.2024
Размер:
3.32 Кб
Скачать
#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;
}





Соседние файлы в папке Лабы