Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
18.08.2022
Размер:
7.66 Кб
Скачать
//#include <iostream>
//#include <cmath>
//#include <vector>
//#include <iomanip>
//
//using namespace std;
//
//vector <vector <float>> CreateMatr(vector <vector <float>> mas, int m) { // Вывод матрицы
//	vector <vector <float>> mas1(m);
//	int k;
//	for (int i = 0; i < m; i++) {
//		for (int j = 0; j < m; j++) {
//			cout << "a[" << i << "][" << j << "] = ";
//			cin >> k;
//			mas1[i].push_back(k);
//		}
//	}
//	return mas1;
//}
//
//vector<vector<float>> reverse(vector<vector<float>> t) {  // Транспонирование
//	vector<vector<float>> res(t.size());
//
//	for (int j = 0; j < t.size(); j++)
//		for (int i = 0; i < t.size(); i++)
//			res[j].push_back(t[i][j]);
//
//	return res;
//}
//
//void print(pair <vector <vector <float>>, vector <float>> para) { // Вывод матрицы со столбцом
//	vector <vector <float>> result = para.first;
//	vector <float> b = para.second;
//
//	for (int i = 0; i < result.size(); i++, cout << endl) {
//		for (int j = 0; j < result[i].size(); j++)
//			cout << setw(7) << result[i][j];
//		cout << setw(7) << "| " << b[i];
//	}
//	cout << endl;
//}
//
//void print2(vector <vector <float>> res) { // Вывод матрицы без столбца
//	for (int i = 0; i < res.size(); i++, cout << endl)
//		for (int j = 0; j < res[i].size(); j++)
//			cout << setw(7) << res[i][j];
//	cout << endl;
//}
//
//vector <vector <float>> iter_str2(vector <vector <float>> mas, int m, int i, int j) { // Замена i и j строк матрицы без столбца
//	vector <vector <float>> mas1 = mas;
//	for (int k = 0; k < m; k++) {
//		if (k == i)
//			mas[k] = mas1[j];
//		else if (k == j)
//			mas[k] = mas1[i];
//		else
//			mas[k] = mas1[k];
//	}
//	return mas;
//}
//
//float determinant(vector <vector <float>> mas, int m) { // Вычисление определителя с помощью метода Гаусса
//	float res = 1;
//	vector <vector <float>> mas1 = mas; // Вспомогательный массив
//
//	for (int k = 0; k < m; k++) {
//		if (mas1[k][k] == 0) { // Если знаменатель равен нулю
//
//			float max = 0;
//			int max_str = k;
//
//			for (int x = k; x < m; x++) { // Поиск в столбце максимального по модулю значения
//				if (abs(mas1[x][k]) > 0) {
//					max_str = x;
//					max = abs(mas1[x][k]);
//				}
//			}
//
//			if (max > 0) {
//				mas1 = iter_str2(mas1, m, k, max_str);
//				cout << "Меняем местами строки с номерами " << k << " и " << max_str << endl;
//				print2(mas1);
//				mas = mas1;
//			}
//		}
//		res *= mas1[k][k];
//		for (int j = k; j < m; j++)
//			mas[k][j] /= mas1[k][k];
//
//		for (int i = k + 1; i < m; i++)
//			for (int j = k; j < m; j++)
//				mas[i][j] -= mas1[i][k] * mas[k][j];
//
//		mas1 = mas;
//	}
//	return res;
//}
//
//vector <vector <float>> GetMatr(vector <vector <float>> mas, int i, int j, int m) { // Получение матрицы без i-й строки и j-го столбца
//	vector <vector <float>> p1(m);
//	int ki, kj, di, dj;
//	di = 0;
//
//	for (ki = 0; ki < m - 1; ki++) { // Проверка индекса строки
//		if (ki == i)
//			di = 1;
//		dj = 0;
//		for (kj = 0; kj < m - 1; kj++) { // Проверка индекса столбца
//			if (kj == j)
//				dj = 1;
//			p1[ki].push_back(mas[ki + di][kj + dj]);
//		}
//	}
//	return p1;
//}
//
//pair <vector <vector <float>>, vector <float>> iter_str (pair <vector <vector <float>>, vector <float>> para, int m, int i, int j) { // Функция замены i и j строк матрицы
//	vector <vector <float>> mas = para.first;
//	vector <float> b = para.second;
//	vector <vector <float>> mas1 = mas;
//	vector <float> b1 = b;
//
//	for (int k = 0; k < m; k++) {
//		if (k == i) {
//			mas[k] = mas1[j];
//			b[k] = b1[j];
//		}
//		else if (k == j) {
//			mas[k] = mas1[i];
//			b[k] = b1[i];
//		}
//		else {
//			mas[k] = mas1[k];
//			b[k] = b1[k];
//		}
//	}
//	pair <vector <vector <float>>, vector <float>> para1(mas, b);
//	return para1;
//}
//
//vector<float> Gauss (pair <vector <vector <float>>, vector <float>> para, int m, vector <float> res){
//	vector <vector <float>> mas = para.first;
//	vector <float> b = para.second;
//	vector <vector <float>> mas1 = mas; // Копия для замены строк
//
//	cout << "Процесс прямого хода: " << endl;
//	for (int k = 0; k < m; k++) { 
//
//		if (mas1[k][k] == 0) {
//			float max = 0;
//			int max_str = k;
//
//			for (int x = k; x < m; x++) {
//				if (abs(mas1[x][k]) > 0) {
//					max_str = x;
//					max = abs(mas1[x][k]);
//				}
//			}
//
//			if (max > 0) {
//				pair <vector <vector <float>>, vector <float>> para(mas1, b);
//				mas1 = iter_str(para, m, k, max_str).first;
//				b = iter_str(para, m, k, max_str).second;
//				cout << "Меняем местами строки с номерами " << k << " и " << max_str << endl;
//				pair <vector <vector <float>>, vector <float>> para1(mas1, b);
//				print(para1);
//				mas = mas1;
//			}
//		}
//		for (int j = k; j < m; j++)
//			mas[k][j] /= mas1[k][k];
//
//		b[k] /= mas1[k][k];
//
//		for (int i = k + 1; i < m; i++) {
//
//			for (int j = k; j < m; j++)
//				mas[i][j] -= mas1[i][k] * mas[k][j];
//
//			b[i] -= mas1[i][k] * b[k];
//		}
//		mas1 = mas;
//		pair <vector <vector <float>>, vector <float>> para(mas, b);
//		print(para);
//	}
//	cout << "Процесс обратного хода: " << endl;
//	float raz = 0;
//	for (int k = m - 1; k >= 0; k--) {
//		cout << "x[" << k << "] = " << b[k];
//
//		for (int x = 0; x < m - 1 - k; x++) {
//			raz += res[x] * mas[k][m - x - 1];
//			cout << " - x[" << m - x - 1 << "] * " << mas[k][m - x - 1];
//		}
//
//		res.push_back(b[k] * 1.0 - raz);
//		cout << " = " << res[res.size() - 1] << endl;
//		raz = 0;
//	}
//	return res;
//}
//
//vector <float> inverse_vector(vector <float> mas, int m) { // Reverse
//	vector <float> res;
//	for (int i = m - 1; i >= 0; i--)
//		res.push_back(mas[i]);
//	return res;
//}
//
//vector <vector <float>> inverse_matrix(vector <vector <float>> mas, int m) { // Обратная матрица
//	vector <vector <float>> result(m);
//
//	if (determinant(mas, m) != 0) {
//		for (int i = 0; i < m; i++)
//			for (int j = 0; j < m; j++)
//				result[i].push_back(pow(-1, i + j) * determinant(GetMatr(mas, i, j, m), m - 1));
//
//		result = reverse(result); // Транспонирование
//
//		for (int i = 0; i < m; i++) // Домножожение на обратный определитель
//			for (int j = 0; j < m; j++)
//				result[i][j] *= 1.0 / determinant(mas, m);
//		cout << "Обратная матрица: " << endl;
//	}
//	else 
//		cout << "Определитель матрицы равен нулю, матрица не обратима" << endl;
//	return result;
//}
//
//vector <vector <float>> inverse_matrix2(vector <vector <float>> mas, int m) { // Обратная матрица 
//	vector <vector <float>> result(m);
//	vector <float> b, res;
//
//	if (determinant(mas, m) != 0) {
//
//		for (int k = 0; k < m; k++) {
//			for (int i = 0; i < m; i++) {
//				if (k == i)
//					b.push_back(1);
//				else
//					b.push_back(0);
//			}
//
//			pair <vector <vector <float>>, vector <float>> para(mas, b);
//			res = Gauss(para, m, res);
//			res = inverse_vector(res, m);
//			for (int i = 0; i < m; i++)
//				result[i].push_back(res[i]);
//
//			b.clear();
//			res.clear();
//		}
//	}
//	else
//		cout << "Определитель матрицы равен нулю, матрица не обратима" << endl;
//	return result;
//}
//
//int main() {
//	setlocale(LC_ALL, "RUS");
//	int m, i, j, d, val;
//	vector <float> b;
//
//	cout << "Введите размерность квадратной матрицы: ";
//	cin >> m;
//	vector <vector <float>> mas = CreateMatr(mas, m);
//	print2(mas);
//	mas = inverse_matrix2(mas, m);
//	print2(mas);
//
//	system("pause");
//	return 0;
//}
Соседние файлы в папке методы вычислений Поплавский