Advertisement
Tvor0zhok

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

Sep 29th, 2022
1,046
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 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.     mat T(n, vec(n));
  37.  
  38.     for (int k = 0; k < n - 1; ++k)
  39.     {
  40.         int m = k;
  41.  
  42.         for (int i = k + 1; i < n; ++i)
  43.             if (fabs(A[i][k]) > fabs(A[m][k])) m = i;
  44.  
  45.         swap(b[k], b[m]);
  46.  
  47.         for (int j = k; j < n; ++j)
  48.             swap(A[k][j], A[m][j]);
  49.  
  50.         for (int i = k + 1; i < n; ++i)
  51.         {
  52.             T[i][k] = A[i][k] / A[k][k];
  53.             b[i] -= T[i][k] * b[k];
  54.  
  55.             for (int j = k + 1; j < n; ++j)
  56.                 A[i][j] -= T[i][k] * A[k][j];
  57.         }
  58.     }      
  59.  
  60.     vec x(n);
  61.  
  62.     x[n - 1] = b[n - 1] / A[n - 1][n - 1];
  63.  
  64.     for (int k = n - 2; k >= 0; --k)
  65.     {
  66.         double sum = 0;
  67.  
  68.         for (int j = k + 1; j < n; ++j)
  69.             sum += A[k][j] * x[j];
  70.  
  71.         x[k] = (b[k] - sum) / A[k][k];
  72.     }
  73.  
  74.     return x;
  75. }
  76.  
  77. void print(mat& A)
  78. {
  79.     int n = A.size();
  80.    
  81.     cout << "Матрица:\n";
  82.  
  83.     for (int i = 0; i < n; ++i, cout << "\n")
  84.         for (int j = 0; j < n; ++j)
  85.             cout << left << setw(10) << A[i][j];
  86. }
  87.  
  88. void print(vec& a)
  89. {
  90.     int n = a.size();
  91.    
  92.     cout << "Вектор: (";
  93.  
  94.     for (int i = 0; i < n - 1; ++i)
  95.         cout << a[i] << ", ";
  96.  
  97.     cout << a[n - 1] << ")\n\n";
  98. }
  99.  
  100. void print(mat& A, vec& b)
  101. {
  102.     int n = b.size();
  103.    
  104.     cout << "Матрица СЛУ имеет вид:\n";
  105.  
  106.     for (int i = 0; i < n; ++i, cout << "\n")
  107.     {
  108.         for (int j = 0; j < n; ++j)
  109.             cout << left << setw(8) << A[i][j];
  110.  
  111.         cout << "| " << b[i];
  112.     }
  113.  
  114.     cout << "\n";
  115. }
  116.  
  117. mat task_matrix(int n)
  118. {
  119.     mat res(n, vec(n));
  120.  
  121.     for (int i = 0; i < n; ++i)
  122.         for (int j = 0; j < n; ++j)
  123.         {
  124.             res[i][j] = v + i;
  125.  
  126.             if (i != j) res[i][j] /= 100.0;
  127.             else
  128.             {
  129.                 int p = rand() % 2;
  130.                 if (p) res[i][j] = 0;
  131.             }
  132.         }
  133.  
  134.     return res;
  135. }
  136.  
  137. mat random_matrix(int n)
  138. {
  139.     mat res(n, vec(n));
  140.  
  141.     for (int i = 0; i < n; ++i)
  142.         for (int j = 0; j < n; ++j)
  143.         {
  144.             res[i][j] = interval_double(gen);
  145.  
  146.             if (i == j)
  147.             {
  148.                 int p = rand() % 2;
  149.                 if (p) res[i][j] = 0;
  150.             }
  151.         }
  152.  
  153.     return res;
  154. }
  155.  
  156. double solve(int n, mat& A, vec& b, vec& x)
  157. {
  158.     vec checkx = Gauss(A, b);
  159.  
  160.     double res = 0.0;
  161.  
  162.     for (int i = 0; i < n; ++i)
  163.         res = max(res, fabs(x[i] - checkx[i]));
  164.  
  165.     return res;
  166. }
  167.  
  168. int main()
  169. {
  170.     srand(time(NULL));
  171.     setlocale(LC_ALL, "Russian");
  172.     cout << fixed << setprecision(7);
  173.  
  174.     vector <int> sizes = { 10, 50, 100, 250, 500, 1000, 2000, 3000, 4000, 5000 };
  175.  
  176.     cout << "+-" << "------" << "+-" << "------------" << "+-" << "------------+\n";
  177.     cout << "| " << "n     " << "| " << "Time        " << "| " << "Accuracy    |\n";
  178.     cout << "+-" << "------" << "+-" << "------------" << "+-" << "------------+\n";
  179.  
  180.     for (auto n : sizes)
  181.     {
  182.         mat A = task_matrix(n);
  183.  
  184.         vec x(n);
  185.  
  186.         for (int i = 0; i < n; ++i)
  187.             x[i] = rand();
  188.  
  189.         vec b = A * x;
  190.  
  191.         system_clock::time_point start = system_clock::now();
  192.  
  193.         double acc = solve(n, A, b, x);
  194.  
  195.         system_clock::time_point end = system_clock::now();
  196.  
  197.         duration <double> delta = end - start;
  198.  
  199.         cout << left << "| " << setw(6) << n << "| " << setw(12) << delta.count() << "| " << setw(12) << acc << "|\n";
  200.     }
  201.  
  202.     cout << "+" << "------" << "+" << "------------" << "+" << "------------+\n";
  203.  
  204.     return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement