Добавил:
SSU_CSIT
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:методы вычислений Поплавский / Metod_Gaussa_Obr_Matr
.cpp//#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;
//}
Соседние файлы в папке методы вычислений Поплавский