RobertDeMilo

СЛАУ Гаусс

Jul 26th, 2025 (edited)
524
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4. #include <stdexcept>
  5.  
  6. using namespace std;
  7.  
  8. // Функция для выделения памяти под матрицу
  9. double** allocate_matrix(int n, int m) {
  10.     double** matrix = new double* [n];
  11.     for (int i = 0; i < n; ++i) {
  12.         matrix[i] = new double[m];
  13.     }
  14.     return matrix;
  15. }
  16.  
  17. // Функция для освобождения памяти матрицы
  18. void free_matrix(double** matrix, int n) {
  19.     for (int i = 0; i < n; ++i) {
  20.         delete[] matrix[i];
  21.     }
  22.     delete[] matrix;
  23. }
  24.  
  25. // Функция ввода матрицы
  26. void input(double** matrix, int* n, int* m) {
  27.     cin >> *n >> *m;
  28.     if (*n <= 0 || *m <= 0) {
  29.         throw invalid_argument("Invalid matrix dimensions");
  30.     }
  31.  
  32.     for (int i = 0; i < *n; ++i) {
  33.         for (int j = 0; j < *m; ++j) {
  34.             cin >> matrix[i][j];
  35.         }
  36.     }
  37. }
  38.  
  39. // Функция вывода матрицы (для отладки)
  40. void output(double** matrix, int n, int m) {
  41.     for (int i = 0; i < n; ++i) {
  42.         for (int j = 0; j < m; ++j) {
  43.             cout << fixed << setprecision(6) << matrix[i][j];
  44.             if (j < m - 1) cout << " ";
  45.         }
  46.         cout << endl;
  47.     }
  48. }
  49.  
  50. // Функция вывода корней
  51. void output_roots(double* roots, int n) {
  52.     for (int i = 0; i < n; ++i) {
  53.         cout << fixed << setprecision(6) << roots[i];
  54.         if (i < n - 1) cout << " ";
  55.     }
  56.     cout << endl;
  57. }
  58.  
  59. // Функция решения СЛАУ методом Гаусса
  60. int sle(double** matrix, int n, int m, double* roots) {
  61.     // Прямой ход метода Гаусса
  62.     for (int col = 0; col < n; ++col) {
  63.         // Поиск ведущего элемента
  64.         int max_row = col;
  65.         for (int i = col + 1; i < n; ++i) {
  66.             if (fabs(matrix[i][col]) > fabs(matrix[max_row][col])) {
  67.                 max_row = i;
  68.             }
  69.         }
  70.  
  71.         // Перестановка строк
  72.         if (max_row != col) {
  73.             for (int j = col; j < m; ++j) {
  74.                 swap(matrix[col][j], matrix[max_row][j]);
  75.             }
  76.         }
  77.  
  78.         // Проверка на нулевой ведущий элемент
  79.         if (fabs(matrix[col][col]) < 1e-10) {
  80.             return 0; // Система вырождена
  81.         }
  82.  
  83.         // Нормализация текущей строки
  84.         for (int j = col + 1; j < m; ++j) {
  85.             matrix[col][j] /= matrix[col][col];
  86.         }
  87.         matrix[col][col] = 1.0;
  88.  
  89.         // Исключение переменной из других уравнений
  90.         for (int i = 0; i < n; ++i) {
  91.             if (i != col && fabs(matrix[i][col]) > 1e-10) {
  92.                 double factor = matrix[i][col];
  93.                 for (int j = col; j < m; ++j) {
  94.                     matrix[i][j] -= matrix[col][j] * factor;
  95.                 }
  96.             }
  97.         }
  98.     }
  99.  
  100.     // Проверка на совместность системы
  101.     for (int i = 0; i < n; ++i) {
  102.         bool all_zero = true;
  103.         for (int j = 0; j < m - 1; ++j) {
  104.             if (fabs(matrix[i][j]) > 1e-10) {
  105.                 all_zero = false;
  106.                 break;
  107.             }
  108.         }
  109.         if (all_zero && fabs(matrix[i][m - 1]) > 1e-10) {
  110.             return 0; // Система несовместна
  111.         }
  112.     }
  113.  
  114.     // Проверка на бесконечное количество решений
  115.     if (n < m - 1) {
  116.         return 0; // Бесконечное количество решений
  117.     }
  118.  
  119.     // Обратный ход - получение решения
  120.     for (int i = 0; i < n; ++i) {
  121.         roots[i] = matrix[i][m - 1];
  122.     }
  123.  
  124.     return 1; // Успешное решение
  125. }
  126.  
  127. int main() {
  128.     int n, m;
  129.     double** matrix = nullptr;
  130.     double* roots = nullptr;
  131.  
  132.     try {
  133.         cin >> n >> m;
  134.         if (n <= 0 || m <= 0 || m != n + 1) {
  135.             throw runtime_error("Invalid input");
  136.         }
  137.  
  138.         matrix = allocate_matrix(n, m);
  139.         roots = new double[n];
  140.  
  141.         for (int i = 0; i < n; ++i) {
  142.             for (int j = 0; j < m; ++j) {
  143.                 cin >> matrix[i][j];
  144.             }
  145.         }
  146.  
  147.         if (sle(matrix, n, m, roots)) {
  148.             output_roots(roots, n);
  149.         }
  150.         else {
  151.             cout << "n/a" << endl;
  152.         }
  153.     }
  154.     catch (...) {
  155.         cout << "n/a" << endl;
  156.     }
  157.  
  158.     if (matrix) free_matrix(matrix, n);
  159.     if (roots) delete[] roots;
  160.  
  161.     return 0;
  162. }
  163. Входные данные
  164. 3 4
  165. 1 1 1 2
  166. 4 5 3 7
  167. 2 7 7 9
  168. Выходные данные
  169. 1.000000 0.000000 1.000000
  170.  
Advertisement
Add Comment
Please, Sign In to add comment