Advertisement
Tvor0zhok

Методы вычислений 29.09.22

Sep 29th, 2022 (edited)
1,201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. typedef vector <double> vec;
  8. typedef vector <vec> mat;
  9.  
  10. const double v = 10;
  11.  
  12. int n;
  13. mat A;
  14. vec x, b;
  15.  
  16. vec operator * (const mat& A, const vec& x)
  17. {
  18.     vec b(n + 1);
  19.  
  20.     for (int i = 0; i <= n; ++i)
  21.         for (int j = 0; j <= n; ++j)
  22.             b[i] += A[i][j] * x[j];
  23.  
  24.     return b;
  25. }
  26.  
  27. vec Gauss(mat& A, vec& b)
  28. {
  29.     int n = b.size();
  30.  
  31.     // прямой ход
  32.     for (int i = 0; i < n; ++i)
  33.     {
  34.         if (fabs(A[i][i]) < 1e-5)
  35.         {
  36.             int m = i;
  37.  
  38.             for (int k = i + 1; k < n; ++k)
  39.                 if (fabs(A[k][i]) > fabs(A[m][i])) m = k;
  40.  
  41.             swap(b[i], b[m]);
  42.  
  43.             for (int j = i; j < n; ++j)
  44.                 swap(A[i][j], A[m][j]);
  45.         }
  46.  
  47.         // нормируем строку
  48.         for (int j = i + 1; j < n; ++j)
  49.             A[i][j] /= A[i][i];
  50.  
  51.         // нормируем строку
  52.         b[i] /= A[i][i]; A[i][i] = 1;
  53.  
  54.         // вычитаем из нижних строк текущую строку
  55.         // получаем в i-ом столбце нули
  56.         for (int k = i + 1; k < n; ++k)
  57.         {
  58.             for (int j = i + 1; j < n; ++j)
  59.                 A[k][j] -= A[i][j] * A[k][i];
  60.  
  61.             b[k] -= b[i] * A[k][i];
  62.  
  63.             A[k][i] = 0;
  64.         }
  65.     }
  66.  
  67.     vec x(n);
  68.  
  69.     // обратный ход
  70.     for (int i = n - 1; i >= 0; --i)
  71.     {
  72.         x[i] = b[i];
  73.  
  74.         for (int j = i + 1; j < n; ++j)
  75.             x[i] -= A[i][j] * x[j];
  76.     }
  77.  
  78.     return x;
  79. }
  80.  
  81. void print(mat& A)
  82. {
  83.     cout << "Матрица:\n";
  84.  
  85.     for (int i = 0; i <= n; ++i, cout << "\n")
  86.         for (int j = 0; j <= n; ++j)
  87.             cout << left << setw(10) << A[i][j];
  88. }
  89.  
  90. void print(vec& a)
  91. {
  92.     cout << "Вектор: (";
  93.  
  94.     for (int i = 0; i < n; ++i)
  95.         cout << a[i] << ", ";
  96.  
  97.     cout << a[n] << ")\n";
  98. }
  99.  
  100. void print(mat& A, vec& b)
  101. {
  102.     cout << "СЛУ имеет вид:\n";
  103.  
  104.     for (int i = 0; i <= n; ++i, cout << "\n")
  105.     {
  106.         for (int j = 0; j < n; ++j)
  107.             cout << A[i][j] << " * x_" << (j + 1) << " + ";
  108.  
  109.         cout << A[i][n] << " * x_" << (n + 1) << " = " << b[i];
  110.     }
  111. }
  112.  
  113. int main()
  114. {
  115.     setlocale(LC_ALL, "Russian");
  116.     cout << fixed << setprecision(4);
  117.  
  118.     n = 10;
  119.  
  120.     A.resize(n + 1);
  121.  
  122.     for (int i = 0; i <= n; ++i)
  123.         for (int j = 0; j <= n; ++j)
  124.         {
  125.             A[i].push_back(v + i);
  126.             if (i != j) A[i][j] /= 100.0;
  127.         }
  128.  
  129.     x.resize(n + 1);
  130.  
  131.     for (int i = 0; i <= n; ++i)
  132.         x[i] = i;
  133.  
  134.     vec b = A * x;
  135.  
  136.     vec checkx = Gauss(A, b);
  137.  
  138.     print(checkx);
  139.  
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement