Advertisement
Tvor0zhok

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

Nov 24th, 2022
667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.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;
  16.  
  17. double y_correct(double x)
  18. {
  19.     return x * x * x * (x - v);
  20. }
  21.  
  22. double f(double x, double y)
  23. {
  24.     return 3 * y / x + (x * x * x);
  25. }
  26.  
  27. void left_rectangular(double a, double b, double h)
  28. {
  29.     // начальные условия
  30.     double x0 = v, y0 = 0, EPS = 1e-9;
  31.  
  32.     vec x, y;
  33.        
  34.     do
  35.     {
  36.         x.push_back(x0);
  37.         y.push_back(y0);
  38.  
  39.         // формула из соотношений (5)
  40.         y0 += h * f(x0, y0);
  41.         x0 += h;
  42.  
  43.     } while (x0 <= b + EPS);
  44.  
  45.     cout << "+-----------------------------------------------------------------------------------+\n";
  46.     cout << "| Формула левых прямоугольников на отрезке [" << a << ", " << b << "] c шагом h = " << h << " |\n";
  47.     cout << "+-----------------------------------------------------------------------------------+\n\n";
  48.  
  49.     cout << left << "+------------+-------------+\n";
  50.     cout << left << "|    x[i]    |    delta    |\n";
  51.     cout << left << "+------------+-------------+\n";
  52.  
  53.     for (int i = 0; i < x.size(); ++i)
  54.         cout << left << "| " << setw(10) << x[i] << " | " << setw(11) << fabs(y[i] - y_correct(x[i])) << " |\n";
  55.  
  56.     cout << left << "+------------+-------------+\n\n";
  57. }
  58.  
  59. void mid_rectangular(double a, double b, double h)
  60. {
  61.     // начальные условия
  62.     double x0 = v, y0 = 0, x_tmp = x0 + h / 2, y_tmp = h / 2 * f(x0, y0), EPS = 1e-9;
  63.  
  64.     vec x, y;
  65.  
  66.     do
  67.     {
  68.         x.push_back(x0);
  69.         y.push_back(y0);
  70.  
  71.         // формулы из соотношений (6, 7)
  72.         y0 += h * f(x_tmp, y_tmp);
  73.         x0 += h;
  74.        
  75.         x_tmp += h;
  76.         y_tmp = y0 + h / 2 * f(x0, y0);
  77.  
  78.     } while (x0 <= b + EPS);
  79.  
  80.     cout << "+-------------------------------------------------------------------------------------+\n";
  81.     cout << "| Формула средних прямоугольников на отрезке [" << a << ", " << b << "] c шагом h = " << h << " |\n";
  82.     cout << "+-------------------------------------------------------------------------------------+\n\n";
  83.  
  84.     cout << left << "+------------+-------------+\n";
  85.     cout << left << "|    x[i]    |    delta    |\n";
  86.     cout << left << "+------------+-------------+\n";
  87.  
  88.     for (int i = 0; i < x.size(); ++i)
  89.         cout << left << "| " << setw(10) << x[i] << " | " << setw(11) << fabs(y[i] - y_correct(x[i])) << " |\n";
  90.  
  91.     cout << left << "+------------+-------------+\n\n";
  92. }
  93.  
  94. void trapezoid(double a, double b, double h)
  95. {
  96.     // начальные условия
  97.     double x0 = v, y0 = 0, x_tmp = x0 + h, y_tmp = h * f(x0, y0), EPS = 1e-9;
  98.  
  99.     vec x, y;
  100.  
  101.     do
  102.     {
  103.         x.push_back(x0);
  104.         y.push_back(y0);
  105.  
  106.         // формулы из соотношений (5, 9)
  107.         y0 += h * (f(x0, y0) + f(x_tmp, y_tmp)) / 2;
  108.         x0 += h;
  109.  
  110.         x_tmp += h;
  111.         y_tmp = y0 + h * f(x0, y0);
  112.  
  113.     } while (x0 <= b + EPS);
  114.  
  115.     cout << "+----------------------------------------------------------------------+\n";
  116.     cout << "| Формула трапеций на отрезке [" << a << ", " << b << "] c шагом h = " << h << " |\n";
  117.     cout << "+----------------------------------------------------------------------+\n\n";
  118.  
  119.     cout << left << "+------------+-------------+\n";
  120.     cout << left << "|    x[i]    |    delta    |\n";
  121.     cout << left << "+------------+-------------+\n";
  122.  
  123.     for (int i = 0; i < x.size(); ++i)
  124.         cout << left << "| " << setw(10) << x[i] << " | " << setw(11) << fabs(y[i] - y_correct(x[i])) << " |\n";
  125.  
  126.     cout << left << "+------------+-------------+\n\n";
  127. }
  128.  
  129. int main()
  130. {
  131.     setlocale(LC_ALL, "Russian");
  132.     cout << fixed << setprecision(5);
  133.  
  134.     double a = v, b = v + 5, h = 0.1;
  135.  
  136.     left_rectangular(a, b, h);
  137.     mid_rectangular(a, b, h);
  138.     trapezoid(a, b, h);
  139.  
  140.     return 0;
  141. }  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement