Advertisement
Vladislav_Bezruk

Untitled

Jan 7th, 2022
686
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4. #define EPS 0.001
  5.  
  6. using namespace std;
  7.  
  8. bool checkRunge(double* y1, double* y2, int s) {
  9.     double max = 0;
  10.     for (int i = 0; i < s; i++)
  11.         if (fabs(y1[i] - y2[2 * i]) > max)
  12.                 max = fabs(y1[i] - y2[2 * i]);
  13.    
  14.     return (max < EPS);
  15. }
  16.  
  17. double p(double x) { return -1. / 2; }
  18.  
  19. double q(double x) { return 3; }
  20.  
  21. double f(double x) { return 2 * pow(x, 2); }
  22.  
  23. double ai(double x, double h) { return 1 - h * p(x) / 2; }
  24.  
  25. double bi(double x, double h) { return -(pow(h, 2) * q(x) - 2); }
  26.  
  27. double ci(double x, double h) { return 1 + h * p(x) / 2; }
  28.  
  29. double di(double x, double h) { return pow(h, 2) * f(x); }
  30.  
  31. int main() {
  32.     double a1 = 1, a2 = 2, A = 0.6, b1 = 1, b2 = 0, B = 1, a = 1, b = 1.3, h, x;
  33.     int n = 3;
  34.     int saverN = n;
  35.     int i;
  36.     double* y1, *y2, *pp, *qq;
  37.     do {
  38.         double b0, c0, d0;
  39.         double an, bn, dn;
  40.         h = (b - a) / n;
  41.         b0 = -(h * a1 - a2);
  42.         c0 = a2;
  43.         d0 = h * A;
  44.         an = -b2;
  45.         bn = -(h * b1 + b2);
  46.         dn = h * B;
  47.         y1 = new double[n + 1];
  48.         pp = new double[n + 1];
  49.         qq = new double[n + 1];
  50.         i = 0;
  51.         pp[i] = c0 / b0;
  52.         qq[i] = (-d0) / b0;
  53.         for (x = a; i < n; i++, x += h)
  54.         {
  55.             pp[i + 1] = ci(x, h) / (bi(x, h) - ai(x, h) * pp[i]);
  56.             qq[i + 1] = (ai(x, h) * qq[i] - di(x, h)) / (bi(x, h) - ai(x, h) * pp[i]);
  57.         }
  58.         y1[n] = (an * qq[n] - dn) / (bn - an * pp[n]);
  59.         for (; i > 0; i--)
  60.         {
  61.             y1[i - 1] = pp[i] * y1[i] + qq[i];
  62.         }
  63.         n *= 2;
  64.         h = (b - a) / n;
  65.         b0 = -(h * a1 - a2);
  66.         c0 = a2;
  67.         d0 = h * A;
  68.         an = -b2;
  69.         bn = -(h * b1 + b2);
  70.         dn = h * B;
  71.         y2 = new double[n + 1];
  72.         pp = new double[n + 1];
  73.         qq = new double[n + 1];
  74.         i = 0;
  75.         pp[i] = c0 / b0;
  76.         qq[i] = (-d0) / b0;
  77.         for (x = a; i < n; i++, x += h)
  78.         {
  79.             pp[i + 1] = ci(x, h) / (bi(x, h) - ai(x, h) * pp[i]);
  80.             qq[i + 1] = (ai(x, h) * qq[i] - di(x, h)) / (bi(x, h) - ai(x, h) * pp[i]);
  81.         }
  82.         y2[n] = (an * qq[n] - dn) / (bn - an * pp[n]);
  83.         for (; i > 0; i--)
  84.         {
  85.             y2[i - 1] = pp[i] * y2[i] + qq[i];
  86.         }
  87.     } while (!checkRunge(y1, y2, n / 2 + 1));
  88.     h = (b - a) / saverN;
  89.     x = a;
  90.     int j = 0;
  91.     for (int i = 0; i <= n; i += n / saverN){
  92.         cout << "x[" << j << "]: " << x << " \ty[" << j << "]: " << y2[i] << endl;
  93.         j++;
  94.         x += h;
  95.     }
  96.    
  97.     cout << endl;
  98.     cout << "n = " << saverN << endl;
  99.     cout << "h = " << h << endl;
  100.    
  101.     return 0;
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement