Advertisement
Tvor0zhok

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

Dec 1st, 2022
991
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 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, EPS = 1e-9;
  16.  
  17. double p(double x)
  18. {
  19.     return x * x;
  20. }
  21.  
  22. double q(double x)
  23. {
  24.     return x;
  25. }
  26.  
  27. double f(double x)
  28. {
  29.     return 4 * pow(x, 4) - 3 * v * pow(x, 3) + 6 * x - 2 * v;
  30. }
  31.  
  32. double y(double x)
  33. {
  34.     return x * x * (x - v);
  35. }
  36.  
  37. vec Tridiagonal(mat& A, vec& b)
  38. {
  39.     int n = A.size();
  40.  
  41.     vec p, q;
  42.  
  43.     // добавляем коэффициенты P2 и Q2
  44.     // a_i = A[i - 1][i - 2]
  45.     // b_i = -A[i - 1][i - 1]
  46.     // c_i = A[i - 1][i]
  47.     // d_i = b[i - 1]
  48.     p.push_back(-A[0][1] / A[0][0]);
  49.     q.push_back(b[0] / A[0][0]);
  50.  
  51.     for (int i = 2; i < n; ++i)
  52.     {
  53.         // добавляем коэффициенты P_(i + 1) и Q_(i + 1)
  54.         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()));
  55.         p.push_back(A[i - 1][i] / (-A[i - 1][i - 1] - A[i - 1][i - 2] * p.back()));
  56.     }
  57.  
  58.     vec res;
  59.  
  60.     // добавляем коэффициент Q_(n + 1) и сразу записываем его в решение
  61.     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()));
  62.  
  63.     for (int i = n - 2; i >= 0; --i)
  64.         res.push_back(p[i] * res.back() + q[i]);
  65.  
  66.     reverse(res.begin(), res.end());
  67.  
  68.     return res;
  69. }
  70.  
  71. void print(vec& a)
  72. {
  73.     int n = a.size();
  74.  
  75.     cout << "Вектор: (";
  76.  
  77.     for (int i = 0; i < n - 1; ++i)
  78.         cout << a[i] << ", ";
  79.  
  80.     cout << a[n - 1] << ")\n\n";
  81. }
  82.  
  83. void print(mat& A, vec& b)
  84. {
  85.     int n = b.size();
  86.  
  87.     cout << "Матрица СЛУ имеет вид:\n";
  88.  
  89.     for (int i = 0; i < n; ++i, cout << "\n")
  90.     {
  91.         for (int j = 0; j < n; ++j)
  92.             cout << left << setw(8) << A[i][j];
  93.  
  94.         cout << "| " << b[i];
  95.     }
  96.  
  97.     cout << "\n";
  98. }
  99.  
  100. int main()
  101. {
  102.     setlocale(LC_ALL, "Russian");
  103.     cout << fixed << setprecision(5);
  104.  
  105.     double h = 0.1, x = h; int n = v / h + 1;
  106.  
  107.     mat A(n, vec(n)); vec b(n), expected_y(n);
  108.  
  109.     A[0][0] = 1; A[n - 1][n - 1] = 1;
  110.  
  111.     for (int i = 1; i < n - 1; ++i, x += h)
  112.     {
  113.         double pi = p(x), qi = q(x), fi = f(x), yi = y(x);
  114.  
  115.         A[i][i - 1] = (1 / h / h - pi / 2 / h);
  116.         A[i][i] = (-2 / h / h + qi);
  117.         A[i][i + 1] = (1 / h / h + pi / 2 / h);
  118.  
  119.         b[i] = fi;
  120.         expected_y[i] = yi;
  121.     }
  122.  
  123.     // print(A, b);
  124.     // print(expected_y);
  125.  
  126.     vec observed_y = Tridiagonal(A, b);
  127.     // print(observed_y);
  128.  
  129.     cout << "+------------+------------+------------+\n";
  130.     cout << "|  expected  |  observed  |   delta    |\n";
  131.     cout << "+------------+------------+------------+\n";
  132.  
  133.     for (int i = 0; i < n; ++i)
  134.         cout << left << "| " << setw(10) << expected_y[i] << " | " << setw(10) << observed_y[i] << " | " << setw(10) << fabs(expected_y[i] - observed_y[i]) << " |\n";
  135.  
  136.     cout << "+------------+------------+------------+";
  137.  
  138.     return 0;
  139. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement