Advertisement
Tvor0zhok

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

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