Advertisement
Tvor0zhok

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

Dec 1st, 2022
1,191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 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 phi_0(int k, double x)
  18. {
  19.     // x^(k + 1) - x^k * v
  20.     return pow(x, k) * (x - v);
  21. }
  22.  
  23. double phi_1(int k, double x)
  24. {
  25.     // (k + 1) * x^k - k * v * x^(k - 1)
  26.     return (k + 1) * pow(x, k) - k * v * pow(x, k - 1);
  27. }
  28.  
  29. double phi_2(int k, double x)
  30. {
  31.     // k * (k + 1) * x^(k - 1) - k * (k - 1) * v * x^(k - 2)
  32.     if (k == 1) return 0;
  33.     else return k * (k + 1) * pow(x, k - 1) - k * (k - 1) * v * pow(x, k - 2);
  34. }
  35.  
  36. double p(double x)
  37. {
  38.     return x * x;
  39. }
  40.  
  41. double q(double x)
  42. {
  43.     return x;
  44. }
  45.  
  46. double f(double x)
  47. {
  48.     return 4 * pow(x, 4) - 3 * v * pow(x, 3) + 6 * x - 2 * v;
  49. }
  50.  
  51. double y(double x)
  52. {
  53.     return x * x * (x - v);
  54. }
  55.  
  56. vec Gauss(mat A, vec b)
  57. {
  58.     int n = b.size();
  59.  
  60.     // прямой ход
  61.     for (int i = 0; i < n; ++i)
  62.     {
  63.         if (fabs(A[i][i]) < 1e-5)
  64.         {
  65.             int m = i;
  66.  
  67.             for (int k = i + 1; k < n; ++k)
  68.                 if (fabs(A[k][i]) > fabs(A[m][i])) m = k;
  69.  
  70.             swap(b[i], b[m]);
  71.  
  72.             for (int j = i; j < n; ++j)
  73.                 swap(A[i][j], A[m][j]);
  74.         }
  75.  
  76.         // нормируем строку
  77.         for (int j = i + 1; j < n; ++j)
  78.             A[i][j] /= A[i][i];
  79.  
  80.         // нормируем строку
  81.         b[i] /= A[i][i]; A[i][i] = 1;
  82.  
  83.         // вычитаем из нижних строк текущую строку
  84.         // получаем в i-ом столбце нули
  85.         for (int k = i + 1; k < n; ++k)
  86.         {
  87.             for (int j = i + 1; j < n; ++j)
  88.                 A[k][j] -= A[i][j] * A[k][i];
  89.  
  90.             b[k] -= b[i] * A[k][i];
  91.         }
  92.     }
  93.  
  94.     vec x(n);
  95.  
  96.     // обратный ход
  97.     for (int i = n - 1; i >= 0; --i)
  98.     {
  99.         x[i] = b[i];
  100.  
  101.         for (int j = i + 1; j < n; ++j)
  102.             x[i] -= A[i][j] * x[j];
  103.     }
  104.  
  105.     return x;
  106. }
  107.  
  108. void print(vec& a)
  109. {
  110.     int n = a.size();
  111.  
  112.     cout << "Вектор: (";
  113.  
  114.     for (int i = 0; i < n - 1; ++i)
  115.         cout << a[i] << ", ";
  116.  
  117.     cout << a[n - 1] << ")\n\n";
  118. }
  119.  
  120. void print(mat& A, vec& b)
  121. {
  122.     int n = b.size();
  123.  
  124.     cout << "Матрица СЛУ имеет вид:\n";
  125.  
  126.     for (int i = 0; i < n; ++i, cout << "\n")
  127.     {
  128.         for (int j = 0; j < n; ++j)
  129.             cout << left << setw(8) << A[i][j];
  130.  
  131.         cout << "| " << b[i];
  132.     }
  133.  
  134.     cout << "\n";
  135. }
  136.  
  137. int main()
  138. {
  139.     setlocale(LC_ALL, "Russian");
  140.     cout << fixed << setprecision(2);
  141.  
  142.     int n = 10;
  143.  
  144.     double h = v / (n + 1), x = h;
  145.  
  146.     mat A(n, vec(n)); vec b(n);
  147.  
  148.     for (int i = 0; i < n; ++i, x += h)
  149.     {
  150.         double pi = p(x), qi = q(x), fi = f(x), yi = y(x);
  151.  
  152.         for (int j = 0; j < n; ++j)
  153.         {
  154.             double phi0 = phi_0(j + 1, x), phi1 = phi_1(j + 1, x), phi2 = phi_2(j + 1, x);
  155.             A[i][j] = phi2 + pi * phi1 + qi * phi0;
  156.         }
  157.  
  158.         b[i] = fi;
  159.     }
  160.  
  161.     // print(A, b);
  162.     // print(expected_y);
  163.  
  164.     vec expected_a(n); expected_a[1] = 1;
  165.     vec observed_a = Gauss(A, b);
  166.     // print(a);
  167.  
  168.     bool ok = true;
  169.  
  170.     for (int i = 0; i < n && ok; ++i)
  171.         ok = fabs(expected_a[i] - observed_a[i]) < EPS;
  172.  
  173.     if (ok) cout << "CORRECT\n";
  174.     else cout << "NOT CORRECT\n";
  175.  
  176.     return 0;
  177. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement