Advertisement
Tvor0zhok

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

Nov 24th, 2022 (edited)
914
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.61 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. mt19937 gen(time(NULL));
  16. uniform_real_distribution<double> interval_double(-10, 10);
  17.  
  18. const double v = 10;
  19.  
  20. vec operator * (const mat& A, const vec& x)
  21. {
  22.     int n = x.size();
  23.  
  24.     vec b(n);
  25.  
  26.     for (int i = 0; i < n; ++i)
  27.         for (int j = 0; j < n; ++j)
  28.             b[i] += A[i][j] * x[j];
  29.  
  30.     return b;
  31. }
  32.  
  33. double det(mat A)
  34. {
  35.     int n = A.size();
  36.  
  37.     double res = 1;
  38.  
  39.     // прямой ход
  40.     for (int i = 0; i < n; ++i)
  41.     {
  42.         if (fabs(A[i][i]) < 1e-5)
  43.         {
  44.             int m = i;
  45.  
  46.             for (int k = i + 1; k < n; ++k)
  47.                 if (fabs(A[k][i]) > fabs(A[m][i])) m = k;
  48.  
  49.             for (int j = i; j < n; ++j)
  50.                 swap(A[i][j], A[m][j]);
  51.  
  52.             res *= (-1);
  53.         }
  54.  
  55.         res *= A[i][i];
  56.  
  57.         // нормируем строку
  58.         for (int j = i + 1; j < n; ++j)
  59.             A[i][j] /= A[i][i];
  60.  
  61.         // нормируем строку
  62.         A[i][i] = 1;
  63.  
  64.         // вычитаем из нижних строк текущую строку
  65.         // получаем в i-ом столбце нули
  66.         for (int k = i + 1; k < n; ++k)
  67.         {
  68.             for (int j = i + 1; j < n; ++j)
  69.                 A[k][j] -= A[i][j] * A[k][i];
  70.         }
  71.     }
  72.  
  73.     return res;
  74. }
  75.  
  76. void print(mat& A)
  77. {
  78.     int n = A.size();
  79.  
  80.     for (int i = 0; i < n; ++i, cout << "\n")
  81.         for (int j = 0; j < n; ++j)
  82.             cout << left << setw(10) << A[i][j];
  83. }
  84.  
  85. void print(vec& a)
  86. {
  87.     int n = a.size();
  88.    
  89.     cout << "Вектор: (";
  90.  
  91.     for (int i = 0; i < n - 1; ++i)
  92.         cout << a[i] << ", ";
  93.  
  94.     cout << a[n - 1] << ")\n\n";
  95. }
  96.  
  97. void print(mat& A, vec& b)
  98. {
  99.     int n = b.size();
  100.    
  101.     cout << "Матрица СЛУ имеет вид:\n";
  102.  
  103.     for (int i = 0; i < n; ++i, cout << "\n")
  104.     {
  105.         for (int j = 0; j < n; ++j)
  106.             cout << left << setw(8) << A[i][j];
  107.  
  108.         cout << "| " << b[i];
  109.     }
  110.  
  111.     cout << "\n";
  112. }
  113.  
  114. mat task_matrix(int n)
  115. {
  116.     mat res(n, vec(n));
  117.  
  118.     for (int i = 0; i < n; ++i)
  119.         for (int j = 0; j < n; ++j)
  120.         {
  121.             if (i == j)
  122.             {
  123.                 if ((rand() % 5) == 0) res[i][j] = 0;
  124.                 else res[i][j] = v + i;
  125.             }
  126.             else
  127.             {
  128.                 if ((rand() % 10) == 0) res[i][j] = 0;
  129.                 else res[i][j] = (v + i) / 100;
  130.             }
  131.         }
  132.  
  133.     return res;
  134. }
  135.  
  136. bool check(vec& x, vec& check_x)
  137. {
  138.     const double EPS = 1e-5;
  139.  
  140.     bool res = true;
  141.  
  142.     for (int i = 0; i < x.size() && res; ++i)
  143.         res = fabs(x[i] - check_x[i]) < EPS;
  144.  
  145.     return res;
  146. }
  147.  
  148. int main()
  149. {
  150.     srand(time(NULL));
  151.     setlocale(LC_ALL, "Russian");
  152.     cout << fixed << setprecision(5);
  153.  
  154.     int n = 100;
  155.     mat A = task_matrix(n);
  156.  
  157.     vec x(n);
  158.  
  159.     for (int i = 0; i < n; ++i)
  160.         x[i] = rand();
  161.  
  162.     vec b = A * x;
  163.  
  164.     // print(A, b);
  165.  
  166.     vec check_x(n);
  167.  
  168.     double det_system = det(A);
  169.  
  170.     for (int j = 0; j < n; ++j)
  171.     {
  172.         mat cur = A;
  173.  
  174.         for (int i = 0; i < n; ++i)
  175.             cur[i][j] = b[i];
  176.  
  177.         check_x[j] = det(cur) / det_system;
  178.     }
  179.  
  180.     // print(x);
  181.     // print(check_x);
  182.  
  183.     if (check(x, check_x)) cout << "n = " << n << " : CORRECT\n";
  184.     else cout << "n = " << n << " : INCORRECT\n";
  185.  
  186.     return 0;
  187. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement