Advertisement
N10py

Untitled

Mar 22nd, 2023
738
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.24 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. // Вывод системы уравнений
  4. void sysout(double** a, double* y, int n)
  5. {
  6.     for (int i = 0; i < n; i++)
  7.     {
  8.         for (int j = 0; j < n; j++)
  9.         {
  10.             cout << a[i][j] << "*x" << j;
  11.             if (j < n - 1) //чтобы в конце не проставлялся +
  12.                 cout << " + ";
  13.         }
  14.         cout << " = " << y[i] << endl;
  15.     }
  16.     return;
  17. }
  18. double* gauss(double** a, double* y, int n)
  19. {
  20.     double* x, max;
  21.     int k, index;
  22.     const double eps = 0.00001;  // точность
  23.     x = new double[n];
  24.     k = 0;
  25.     while (k < n)
  26.     {
  27.         // Поиск строки с максимальным a[i][k]
  28.         max = abs(a[k][k]);
  29.         index = k;
  30.         for (int i = k + 1; i < n; i++)
  31.         {
  32.             if (abs(a[i][k]) > max)
  33.             {
  34.                 max = abs(a[i][k]);
  35.                 index = i;
  36.             }
  37.         }
  38.         // Перестановка строк
  39.         if (max < eps)
  40.         {
  41.             // нет ненулевых диагональных элементов
  42.             cout << "Решение получить невозможно из-за нулевого столбца ";
  43.             cout << index << " матрицы A" << endl;
  44.             return 0;
  45.         }
  46.         for (int j = 0; j < n; j++)
  47.         {
  48.             double temp = a[k][j];
  49.             a[k][j] = a[index][j];
  50.             a[index][j] = temp;
  51.         }
  52.         double temp = y[k];
  53.         y[k] = y[index];
  54.         y[index] = temp;
  55.         // Нормализация уравнений
  56.         for (int i = k; i < n; i++)
  57.         {
  58.             double temp = a[i][k];
  59.             if (abs(temp) < eps) continue; // для нулевого коэффициента пропустить
  60.             for (int j = 0; j < n; j++)
  61.                 a[i][j] = a[i][j] / temp;
  62.             y[i] = y[i] / temp;
  63.             if (i == k)  continue; // уравнение не вычитать само из себя
  64.             for (int j = 0; j < n; j++)
  65.                 a[i][j] = a[i][j] - a[k][j];
  66.             y[i] = y[i] - y[k];
  67.         }
  68.         k++;
  69.     }
  70.     // обратная подстановка
  71.     for (k = n - 1; k >= 0; k--)
  72.     {
  73.         x[k] = y[k];
  74.         for (int i = 0; i < k; i++)
  75.             y[i] = y[i] - a[i][k] * x[k];
  76.     }
  77.     return x;
  78. }
  79. int main()
  80. {
  81.     double** a, * y, * x;
  82.     int n;
  83.     setlocale(LC_ALL, "rus");
  84.     cout << "Введите количество уравнений: ";
  85.     cin >> n;
  86.     a = new double* [n];
  87.     y = new double[n];
  88.     for (int i = 0; i < n; i++) //Ввод коэфицентов
  89.     {
  90.         a[i] = new double[n];
  91.         for (int j = 0; j < n; j++)
  92.         {
  93.             cout << "a[" << i << "][" << j << "]= ";
  94.             cin >> a[i][j];
  95.         }
  96.     }
  97.     for (int i = 0; i < n; i++) //Ввод b вектора
  98.     {
  99.         cout << "y[" << i << "]= ";
  100.         cin >> y[i];
  101.     }
  102.     sysout(a, y, n);
  103.     x = gauss(a, y, n);
  104.     for (int i = 0; i < n; i++)
  105.         cout << "x[" << i << "]=" << x[i] << endl;
  106.     cin.get(); cin.get(); // конец програмы, если ввести любой символ
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement