Advertisement
Tvor0zhok

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

Dec 8th, 2022
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 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-5;
  16.  
  17. double F_A(int k, int j, double x)
  18. {
  19.     return pow(x, k + j + 1) / (k + j + 1);
  20. }
  21.  
  22. double A(int k, int j, double a, double b)
  23. {
  24.     return F_A(k, j, b) - F_A(k, j, a);
  25. }
  26.  
  27. double F_phi(int j, double x)
  28. {
  29.     return v * ((pow(x, j + 2) * 4 / 3 / (j + 2)) + (pow(x, j + 3) / 4 / (j + 3)) + (pow(x, j + 4) / 5 / (j + 4)));
  30. }
  31.  
  32. double phi(int j, double a, double b)
  33. {
  34.     return F_phi(j, b) - F_phi(j, a);
  35. }
  36.  
  37. vec Gauss(mat A, vec b)
  38. {
  39.     int n = b.size();
  40.  
  41.     // прямой ход
  42.     for (int i = 0; i < n; ++i)
  43.     {
  44.         if (fabs(A[i][i]) < 1e-5)
  45.         {
  46.             int m = i;
  47.  
  48.             for (int k = i + 1; k < n; ++k)
  49.                 if (fabs(A[k][i]) > fabs(A[m][i])) m = k;
  50.  
  51.             swap(b[i], b[m]);
  52.  
  53.             for (int j = i; j < n; ++j)
  54.                 swap(A[i][j], A[m][j]);
  55.         }
  56.  
  57.         // нормируем строку
  58.         for (int j = i + 1; j < n; ++j)
  59.             A[i][j] /= A[i][i];
  60.  
  61.         // нормируем строку
  62.         b[i] /= A[i][i]; A[i][i] = 1;
  63.  
  64.         // вычитаем из нижних строк текущую строку
  65.         // получаем в i-ом столбце нули
  66.         for (int k = i + 1; k < n; ++k)
  67.         {
  68.             for (int j = i + 1; j < n; ++j)
  69.                 A[k][j] -= A[i][j] * A[k][i];
  70.  
  71.             b[k] -= b[i] * A[k][i];
  72.         }
  73.     }
  74.  
  75.     vec x(n);
  76.  
  77.     // обратный ход
  78.     for (int i = n - 1; i >= 0; --i)
  79.     {
  80.         x[i] = b[i];
  81.  
  82.         for (int j = i + 1; j < n; ++j)
  83.             x[i] -= A[i][j] * x[j];
  84.     }
  85.  
  86.     return x;
  87. }
  88.  
  89. void print(vec& a)
  90. {
  91.     int n = a.size();
  92.  
  93.     cout << "Вектор: (";
  94.  
  95.     for (int i = 0; i < n - 1; ++i)
  96.         cout << a[i] << ", ";
  97.  
  98.     cout << a[n - 1] << ")\n\n";
  99. }
  100.  
  101. void print(mat& A, vec& b)
  102. {
  103.     int n = b.size();
  104.  
  105.     cout << "Матрица СЛУ имеет вид:\n";
  106.  
  107.     for (int i = 0; i < n; ++i, cout << "\n")
  108.     {
  109.         for (int j = 0; j < n; ++j)
  110.             cout << left << setw(8) << A[i][j];
  111.  
  112.         cout << "| " << b[i];
  113.     }
  114.  
  115.     cout << "\n";
  116. }
  117.  
  118. int main()
  119. {
  120.     setlocale(LC_ALL, "Russian");
  121.     cout << fixed << setprecision(2);
  122.  
  123.     int n = 3;
  124.  
  125.     mat matrix(n, vec(n));
  126.  
  127.     for (int k = 0; k < n; ++k)
  128.         for (int j = 0; j < n; ++j)
  129.             matrix[k][j] = A(k + 1, j + 1, 0, 1) + (k == j);
  130.  
  131.     vec b(n);
  132.  
  133.     for (int j = 0; j < n; ++j)
  134.         b[j] = phi(j + 1, 0, 1);
  135.  
  136.     print(matrix, b);
  137.  
  138.     vec q = Gauss(matrix, b);
  139.  
  140.     cout << "Точное решение: " << v << " * x\n";
  141.     cout << "Приближенное решение: (x * " << 4 * v << " / 3) + (x^2 * " << v << " / 4) + (" << "x^3 * " << v << " / 5)";
  142.  
  143.     for (int k = 0; k < n; ++k)
  144.     {
  145.         cout << " - (" << q[k] << " * x";
  146.         if (k) cout << "^" << k + 1;
  147.  
  148.         cout << ")";
  149.     }
  150.  
  151.     return 0;
  152. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement