Advertisement
Tvor0zhok

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

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