Advertisement
Tvor0zhok

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

Oct 28th, 2022
1,916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <vector>
  5. #include <random>
  6. #include <chrono>
  7. #include <cmath>
  8. #include <ctime>
  9. using namespace std;
  10. using namespace chrono;
  11.  
  12. typedef vector <double> vec;
  13. typedef vector <vec> mat;
  14.  
  15. const double v = 10;
  16.  
  17. mat operator * (const mat& A, const mat& B)
  18. {
  19.     int n = A.size(), m = B.size(), l = B[0].size();
  20.  
  21.     mat res(n, vec(l));
  22.  
  23.     for (int i = 0; i < n; ++i)
  24.         for (int j = 0; j < l; ++j)
  25.             for (int k = 0; k < m; ++k)
  26.                 res[i][j] += A[i][k] * B[k][j];
  27.  
  28.     return res;
  29. }
  30.  
  31. vec Gauss(mat A, vec b)
  32. {
  33.     int n = b.size();
  34.  
  35.     // прямой ход
  36.     for (int i = 0; i < n; ++i)
  37.     {
  38.         if (fabs(A[i][i]) < 1e-5)
  39.         {
  40.             int m = i;
  41.  
  42.             for (int k = i + 1; k < n; ++k)
  43.                 if (fabs(A[k][i]) > fabs(A[m][i])) m = k;
  44.  
  45.             swap(b[i], b[m]);
  46.  
  47.             for (int j = i; j < n; ++j)
  48.                 swap(A[i][j], A[m][j]);
  49.         }
  50.  
  51.         // нормируем строку
  52.         for (int j = i + 1; j < n; ++j)
  53.             A[i][j] /= A[i][i];
  54.  
  55.         // нормируем строку
  56.         b[i] /= A[i][i]; A[i][i] = 1;
  57.  
  58.         // вычитаем из нижних строк текущую строку
  59.         // получаем в i-ом столбце нули
  60.         for (int k = i + 1; k < n; ++k)
  61.         {
  62.             for (int j = i + 1; j < n; ++j)
  63.                 A[k][j] -= A[i][j] * A[k][i];
  64.  
  65.             b[k] -= b[i] * A[k][i];
  66.         }        
  67.     }
  68.  
  69.     vec x(n);
  70.  
  71.     // обратный ход
  72.     for (int i = n - 1; i >= 0; --i)
  73.     {
  74.         x[i] = b[i];
  75.  
  76.         for (int j = i + 1; j < n; ++j)
  77.             x[i] -= A[i][j] * x[j];
  78.     }
  79.  
  80.     return x;
  81. }
  82.  
  83. void print(mat& A)
  84. {
  85.     int n = A.size();
  86.  
  87.     for (int i = 0; i < n; ++i, cout << "\n")
  88.         for (int j = 0; j < n; ++j)
  89.             cout << left << setw(10) << A[i][j];
  90. }
  91.  
  92. void print(vec& a)
  93. {
  94.     int n = a.size();
  95.    
  96.     cout << "Вектор: (";
  97.  
  98.     for (int i = 0; i < n - 1; ++i)
  99.         cout << a[i] << ", ";
  100.  
  101.     cout << a[n - 1] << ")\n\n";
  102. }
  103.  
  104. void print(mat& A, vec& b)
  105. {
  106.     int n = b.size();
  107.    
  108.     cout << "Матрица СЛУ имеет вид:\n";
  109.  
  110.     for (int i = 0; i < n; ++i, cout << "\n")
  111.     {
  112.         for (int j = 0; j < n; ++j)
  113.             cout << left << setw(8) << A[i][j];
  114.  
  115.         cout << "| " << b[i];
  116.     }
  117.  
  118.     cout << "\n";
  119. }
  120.  
  121. mat task_matrix(int n)
  122. {
  123.     mat res(n, vec(n));
  124.  
  125.     for (int i = 0; i < n; ++i)
  126.         for (int j = 0; j < n; ++j)
  127.         {
  128.             res[i][j] = v + i;
  129.  
  130.             if (i != j) res[i][j] /= 100.0;
  131.             else
  132.             {
  133.                 int p = rand() % 5;
  134.                 if (p == 0)  res[i][j] = 0;
  135.             }
  136.         }
  137.  
  138.     return res;
  139. }
  140.  
  141. mat transpose(mat& A)
  142. {
  143.     mat res(A[0].size(), vec(A.size()));
  144.  
  145.     for (int i = 0; i < A.size(); ++i)
  146.         for (int j = 0; j < A[0].size(); ++j)
  147.             res[j][i] = A[i][j];
  148.  
  149.     return res;
  150. }
  151.  
  152. bool check(mat& A)
  153. {
  154.     const double EPS = 1e-9;
  155.  
  156.     bool res = true;
  157.  
  158.     for (int i = 0; i < A.size() && res; ++i)
  159.         for (int j = 0; j < A[0].size() && res; ++j)
  160.             if (i == j) res = fabs(A[i][j] - 1) < EPS;
  161.             else res = fabs(A[i][j]) < EPS;
  162.  
  163.     return res;
  164. }
  165.  
  166. int main()
  167. {
  168.     srand(time(NULL));
  169.     setlocale(LC_ALL, "Russian");
  170.     cout << fixed << setprecision(2);
  171.  
  172.     int n = 100;
  173.     mat A = task_matrix(n);
  174.  
  175.     mat B(n, vec(n));
  176.  
  177.     for (int i = 0; i < n; ++i)
  178.     {
  179.         vec b(n); b[i] = 1;
  180.         B[i] = Gauss(A, b);
  181.     }
  182.  
  183.     B = transpose(B);
  184.  
  185.     cout << "Матрица A:\n\n";
  186.     print(A);
  187.  
  188.     cout << "\nМатрица B = A^(-1):\n\n";
  189.     print(B);
  190.  
  191.     cout << "\nМатрица C = A * B = E\n\n";
  192.     mat C = A * B;
  193.  
  194.     print(C);
  195.  
  196.     if (check(C)) cout << "\nCORRECT\n\n";
  197.     else cout << "\nINCORRECT\n\n";
  198.  
  199.     cout << "\nМатрица C = B * A = E\n\n";
  200.     C = B * A;
  201.  
  202.     print(C);
  203.  
  204.     if (check(C)) cout << "\nCORRECT\n\n";
  205.     else cout << "\nINCORRECT\n\n";
  206.  
  207.     return 0;
  208. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement