Advertisement
Tvor0zhok

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

Oct 13th, 2022 (edited)
860
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.30 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. struct Polynomial
  16. {
  17.     double a, b, c, d;
  18.  
  19.     Polynomial() {}
  20.     Polynomial(double a, double b, double c, double d) : a(a), b(b), c(c), d(d) {}
  21. };
  22.  
  23. const double v = 10;
  24.  
  25. double P(double x)
  26. {
  27.     return (-x * x * x / 6.0) + (3 * x * x / 2.0) - (x / 3.0) + 10.0;
  28. }
  29.  
  30. vec Gauss(mat& A, vec& b)
  31. {
  32.     int n = b.size();
  33.  
  34.     // прямой ход
  35.     for (int i = 0; i < n; ++i)
  36.     {
  37.         if (fabs(A[i][i]) < 1e-5)
  38.         {
  39.             int m = i;
  40.  
  41.             for (int k = i + 1; k < n; ++k)
  42.                 if (fabs(A[k][i]) > fabs(A[m][i])) m = k;
  43.  
  44.             swap(b[i], b[m]);
  45.  
  46.             for (int j = i; j < n; ++j)
  47.                 swap(A[i][j], A[m][j]);
  48.         }
  49.  
  50.         // нормируем строку
  51.         for (int j = i + 1; j < n; ++j)
  52.             A[i][j] /= A[i][i];
  53.  
  54.         // нормируем строку
  55.         b[i] /= A[i][i]; A[i][i] = 1;
  56.  
  57.         // вычитаем из нижних строк текущую строку
  58.         // получаем в i-ом столбце нули
  59.         for (int k = i + 1; k < n; ++k)
  60.         {
  61.             for (int j = i + 1; j < n; ++j)
  62.                 A[k][j] -= A[i][j] * A[k][i];
  63.  
  64.             b[k] -= b[i] * A[k][i];
  65.         }
  66.     }
  67.  
  68.     vec x(n);
  69.  
  70.     // обратный ход
  71.     for (int i = n - 1; i >= 0; --i)
  72.     {
  73.         x[i] = b[i];
  74.  
  75.         for (int j = i + 1; j < n; ++j)
  76.             x[i] -= A[i][j] * x[j];
  77.     }
  78.  
  79.     return x;
  80. }
  81.  
  82. void print(mat& A)
  83. {
  84.     int n = A.size();
  85.  
  86.     cout << "Матрица:\n";
  87.  
  88.     for (int i = 0; i < n; ++i, cout << "\n")
  89.         for (int j = 0; j < n; ++j)
  90.             cout << left << setw(10) << A[i][j];
  91. }
  92.  
  93. void print(vec& a)
  94. {
  95.     int n = a.size();
  96.  
  97.     cout << "Вектор: (";
  98.  
  99.     for (int i = 0; i < n - 1; ++i)
  100.         cout << a[i] << ", ";
  101.  
  102.     cout << a[n - 1] << ")\n\n";
  103. }
  104.  
  105. void print(mat& A, vec& b)
  106. {
  107.     int n = b.size();
  108.  
  109.     cout << "Матрица СЛУ имеет вид:\n";
  110.  
  111.     for (int i = 0; i < n; ++i, cout << "\n")
  112.     {
  113.         for (int j = 0; j < n; ++j)
  114.             cout << left << setw(8) << A[i][j];
  115.  
  116.         cout << "| " << b[i];
  117.     }
  118.  
  119.     cout << "\n";
  120. }
  121.  
  122. double solve(int n, mat& A, vec& b, vec& x)
  123. {
  124.     vec checkx = Gauss(A, b);
  125.  
  126.     double res = 0.0;
  127.  
  128.     for (int i = 0; i < n; ++i)
  129.         res = max(res, fabs(x[i] - checkx[i]));
  130.  
  131.     return res;
  132. }
  133.  
  134. int main()
  135. {
  136.     srand(time(NULL));
  137.     setlocale(LC_ALL, "Russian");
  138.     cout << fixed << setprecision(2);
  139.  
  140.     int n = 3;
  141.     double h = 1;
  142.  
  143.     vec x = { 0, 1, 2, 3 };
  144.     vec y = { 10, 11, 14, 18 };
  145.  
  146.     mat A(4 * n, vec(4 * n, 0));
  147.     vec b(4 * n, 0);
  148.  
  149.     // a[k] = x[4k]
  150.     // b[k] = x[4k + 1]
  151.     // c[k] = x[4k + 2]
  152.     // d[k] = x[4k + 3]
  153.     // k = 0 ... n - 1
  154.  
  155.     // Уравнения (1) : 1 * a[i] = y[i]
  156.     for (int i = 0, j = 0; i < n; ++i, j += 4)
  157.     {
  158.         A[i][j] = 1;
  159.         b[i] = y[i];
  160.     }
  161.  
  162.     // Уравнения (2) : 1 * a[i - n] + h * b[i - n] + h^2 * c[i - n] + h^3 * d[i - n] = f[i - n + 1]
  163.     for (int i = n, j = 0; i < 2 * n; ++i, j += 4)
  164.     {
  165.         A[i][j] = 1;
  166.         A[i][j + 1] = h;
  167.         A[i][j + 2] = h * h;
  168.         A[i][j + 3] = h * h * h;
  169.  
  170.         b[i] = y[i - n + 1];
  171.     }
  172.  
  173.     // Уравнения (3) : 1 * b[i - 2n] + 2h * c[i - 2n] + 3h^2 * d[i - 2n] - b[i - 2n + 1] = 0
  174.     for (int i = 2 * n, j = 0; i < 3 * n - 1; ++i, j += 4)
  175.     {
  176.         A[i][j + 1] = 1;
  177.         A[i][j + 2] = 2 * h;
  178.         A[i][j + 3] = 3 * h * h;
  179.         A[i][j + 5] = -1;
  180.     }
  181.  
  182.     // Уравнения (4) : 1 * c[i - 3n + 1] + 3h * d[i - 3n + 1] - c[i - 3n + 2] = 0
  183.     for (int i = 3 * n - 1, j = 0; i < 4 * n - 2; ++i, j += 4)
  184.     {
  185.         A[i][j + 2] = 1;
  186.         A[i][j + 3] = 3 * h;
  187.         A[i][j + 6] = -1;
  188.     }
  189.  
  190.     // Уравнения (5)
  191.     A[4 * n - 2][2] = 1;
  192.     A[4 * n - 1][4 * n - 2] = 1;
  193.     A[4 * n - 1][4 * n - 1] = 3 * h;
  194.  
  195.     print(A, b);
  196.  
  197.     vec sol = Gauss(A, b);
  198.  
  199.     vector <Polynomial> p(n);
  200.  
  201.     for (int i = 0; i < 4 * n; i += 4)
  202.     {
  203.         p[i / 4].a = sol[i];
  204.         p[i / 4].b = sol[i + 1];
  205.         p[i / 4].c = sol[i + 2];
  206.         p[i / 4].d = sol[i + 3];
  207.     }
  208.  
  209.     for (int i = 0; i < n; ++i)
  210.     {
  211.         cout << "S[" << i << "](x) : ";
  212.         cout << left << setw(10) << p[i].a << setw(10) << p[i].b << setw(10) << p[i].c << setw(10) << p[i].d << "\n";
  213.     }
  214.  
  215.     cout << '\n';
  216.  
  217.     x = { 0, 0.5, 1, 1.5, 2, 2.5, 3 };
  218.  
  219.     cout << left << "x: ";
  220.  
  221.     for (int i = 0; i < x.size(); ++i)
  222.         cout << setw(10) << x[i];
  223.  
  224.     cout << "\n" << left << "y: ";
  225.  
  226.     for (int i = 0; i < p.size(); ++i)
  227.     {
  228.         Polynomial cur = p[i];
  229.  
  230.         for (int j = 0; j < 2; ++j)
  231.             cout << setw(10) << cur.a + cur.b * (x[2 * i + j] - i) + cur.c * pow(x[2 * i + j] - i, 2) + cur.d * pow(x[2 * i + j] - i, 3);
  232.     }
  233.  
  234.     Polynomial last = p[p.size() - 1];
  235.     double last_x = x[x.size() - 1];
  236.  
  237.     cout << last.a + last.b * (last_x - 2) + last.c * pow(last_x - 2, 2) + last.d * pow(last_x - 2, 3);
  238.  
  239.     return 0;
  240. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement