Advertisement
Tvor0zhok

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

Nov 10th, 2022
1,201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 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. vec Tridiagonal(mat& A, vec& b)
  34. {
  35.     int n = A.size();
  36.  
  37.     vec p, q;
  38.  
  39.     // добавляем коэффициенты P2 и Q2
  40.     // a_i = A[i - 1][i - 2]
  41.     // b_i = -A[i - 1][i - 1]
  42.     // c_i = A[i - 1][i]
  43.     // d_i = b[i - 1]
  44.     p.push_back(-A[0][1] / A[0][0]);
  45.     q.push_back(b[0] / A[0][0]);
  46.  
  47.     for (int i = 2; i < n; ++i)
  48.     {
  49.         // добавляем коэффициенты P_(i + 1) и Q_(i + 1)
  50.         q.push_back((A[i - 1][i - 2] * q.back() - b[i - 1]) / (-A[i - 1][i - 1] - A[i - 1][i - 2] * p.back()));
  51.         p.push_back(A[i - 1][i] / (-A[i - 1][i - 1] - A[i - 1][i - 2] * p.back()));
  52.     }
  53.  
  54.     vec res;
  55.  
  56.     // добавляем коэффициент Q_(n + 1) и сразу записываем его в решение
  57.     res.push_back((A[n - 1][n - 2] * q.back() - b[n - 1]) / (-A[n - 1][n - 1] - A[n - 1][n - 2] * p.back()));
  58.  
  59.     for (int i = n - 2; i >= 0; --i)
  60.         res.push_back(p[i] * res.back() + q[i]);
  61.  
  62.     reverse(res.begin(), res.end());
  63.  
  64.     return res;
  65. }
  66.  
  67. void print(mat& A)
  68. {
  69.     int n = A.size();
  70.  
  71.     for (int i = 0; i < n; ++i, cout << "\n")
  72.         for (int j = 0; j < n; ++j)
  73.             cout << left << setw(10) << A[i][j];
  74. }
  75.  
  76. void print(vec& a)
  77. {
  78.     int n = a.size();
  79.    
  80.     cout << "Вектор: (";
  81.  
  82.     for (int i = 0; i < n - 1; ++i)
  83.         cout << a[i] << ", ";
  84.  
  85.     cout << a[n - 1] << ")\n\n";
  86. }
  87.  
  88. void print(mat& A, vec& b)
  89. {
  90.     int n = b.size();
  91.    
  92.     cout << "Матрица СЛУ имеет вид:\n";
  93.  
  94.     for (int i = 0; i < n; ++i, cout << "\n")
  95.     {
  96.         for (int j = 0; j < n; ++j)
  97.             cout << left << setw(8) << A[i][j];
  98.  
  99.         cout << "| " << b[i];
  100.     }
  101.  
  102.     cout << "\n";
  103. }
  104.  
  105. mat task_matrix(int n)
  106. {
  107.     mat res(n, vec(n));
  108.  
  109.     for (int i = 0; i < n; ++i)
  110.         for (int j = 0; j < n; ++j)
  111.         {
  112.             if (i == j) res[i][j] = v + i;
  113.             else if (0 < abs(i - j) && abs(i - j) < 2) res[i][j] = (v + i) / 100.0;
  114.         }
  115.  
  116.     return res;
  117. }
  118.  
  119. int main()
  120. {
  121.     srand(time(NULL));
  122.     setlocale(LC_ALL, "Russian");
  123.     cout << fixed << setprecision(5);
  124.  
  125.     int n = 10;
  126.     mat A = task_matrix(n);
  127.  
  128.     print(A);
  129.  
  130.     vec x(n);
  131.     for (int i = 0; i < n; ++i)
  132.         x[i] = interval_double(gen);
  133.  
  134.     vec b = A * x;
  135.  
  136.     vec checkx = Tridiagonal(A, b);
  137.  
  138.     print(x);
  139.     print(checkx);  
  140.  
  141.     return 0;
  142. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement