Advertisement
VladimirKostovsky

Гаусс. ЧМ. 1 лаба

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