Advertisement
Guest User

Untitled

a guest
May 27th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <limits.h>
  6. #include <vector>
  7. #define start 1
  8. #define N 15
  9. #pragma warning (disable:4996)
  10. using namespace std;
  11. long double yy[N+1];
  12. long double xx[N+1];
  13. long double p(long double e)
  14. {
  15.     int random;
  16.     random = 1 + rand() % 20000;
  17.     return e*random*0.001;
  18. }
  19. void masx(double h, double a, double b)
  20. {
  21.     for (int i = 0; i <= N; i++)
  22.     {
  23.         xx[i] = a + h*i;
  24.     }
  25. }
  26. long double fact(long double x)
  27. {
  28.     return (sin(x) + cos(x));
  29. }
  30. long double f(long double x, long double y)
  31. {
  32.     return ((1 / cos(x)) - y*(sin(x) / cos(x)));
  33. }
  34. long double calc(long double x, long double y, long double h)
  35. {
  36.     long double yy;
  37.     long double ff;
  38.     ff = f(x, y);
  39.     yy = y + h*ff;
  40.     return (y + h*(ff + f(x + h, yy)) / 2);
  41. }
  42. int k=1; //количество отрезков, h - длина одного
  43. long double hh;
  44. vector<pair<long double, long double>> RK(long double e, long double a, long double b, long double y) //возвращает значение для точки с заданной точностью
  45. {
  46.     vector<pair<long double, long double>> vec;
  47.     long double y0_1, y0_2, y1, y2;
  48.     k = 1;
  49.     do
  50.     {
  51.         hh = 0;
  52.         vec.clear();
  53.         y0_1 = y;
  54.         y0_2 = y;
  55.         vec.push_back(make_pair(a, y0_2));
  56.         long double h = (b - a) / k;
  57.         for (int i = 0; i < k; i++)
  58.         {
  59.             y1 = calc(a + i*h, y0_1, h);
  60.             //y1 = y0_1 + (h / 2.0)*(f(a + (i+1)*h, y1) + f(a + i*h, y0_1));
  61.             y0_1 = y1;
  62.         }
  63.         for (int j = 0; j < 2 * k; j++)
  64.         {
  65.             y2 = calc(a + (j*h) / 2, y0_2, h / 2);
  66.             vec.push_back(make_pair(a + ((j+1)*h) / 2, y2));
  67.             //y2 = y0_2 + (h / 4.0)*(f(a + (j + 1)*h, y1) + f(a + j*h, y0_2));
  68.             y0_2 = y2;
  69.         }
  70.         k *= 2;
  71.         hh = h / 2;
  72.     } while (fabs((y1 - y2)) > e);
  73.     return vec;
  74. }
  75. void adams(long double e, long double a, long double b, long double h, long double y_start, FILE *F)
  76. {
  77.     int maxx = 0;
  78.     int min = INT_MAX;
  79.     long double max=0;
  80.     long double max2 = 0;
  81.     yy[0] = y_start;
  82.     for (int n = 1; n <= N; n++)
  83.     {
  84.         vector <pair<long double, long double>> yyy = RK(e, xx[n - 1], xx[n], yy[n - 1]); //по р-к находится точка
  85.         if (k < min) min = k;
  86.         if (k > maxx) maxx = k;
  87.         long double pogr2 = fabs(yyy[yyy.size() - 1].second - fact(xx[n]));
  88.         if (max2 < pogr2) max2 = pogr2;
  89.         for (unsigned int i = 1; i < yyy.size(); i++)
  90.         {
  91.             yyy[i].second = yyy[i - 1].second + (hh / 2.0)*(f(yyy[i-1].first, yyy[i - 1].second) + f(yyy[i].first, yyy[i].second));
  92.         }
  93.         yy[n] = yyy[yyy.size() - 1].second;
  94.         long double pogr = fabs(fact(xx[n]) - yy[n]);
  95.         if (max < pogr) max = pogr;
  96.     }
  97.     //fprintf(F, "%i ", min);
  98.     printf("%e ", max);
  99.     printf("%e \n", max2);
  100.     //fprintf(F, "%e ", max);
  101.     //fprintf(F, "%e ", max2); //р-к
  102. }
  103. long double RK1(long double e, long double a, long double b, long double y) //возвращает значение для точки с заданной точностью
  104. {
  105.     long double y0_1, y0_2, y1, y2;
  106.     do
  107.     {
  108.         y0_1 = y;
  109.         y0_2 = y;
  110.         long double h = (b - a) / k;
  111.         for (int i = 0; i < k; i++)
  112.         {
  113.             y1 = calc(a + i*h, y0_1, h);
  114.             y1 = y0_1 + (h / 2.0)*(f(a + (i + 1)*h, y1) + f(a + i*h, y0_1));
  115.             y0_1 = y1;
  116.         }
  117.         for (int j = 0; j < 2 * k; j++)
  118.         {
  119.             y2 = calc(a + (j*h) / 2, y0_2, h / 2);
  120.             y2 = y0_2 + (h / 4.0)*(f(a + (j + 1)*h, y1) + f(a + j*h, y0_2));
  121.             y0_2 = y2;
  122.         }
  123.         k *= 2;
  124.     } while (fabs((y1 - y2)) > e);
  125.     k = 1;
  126.     return y2;
  127. }
  128. void adams1(long double e, long double a, long double b, long double h, long double y_start, FILE *F)
  129. {
  130.     int maxx = 0;
  131.     int min = INT_MAX;
  132.     long double max = 0;
  133.     yy[0] = y_start;
  134.     for (int n = 1; n <= N; n++)
  135.     {
  136.         yy[n] = RK1(e, xx[n-1], xx[n], yy[n-1]);
  137.         long double pogr = fabs(fact(xx[n]) - yy[n]);
  138.         if (max < pogr) max = pogr;
  139.     }
  140.     //fprintf(F, "%i ", min);
  141.     printf("%e ", max);
  142.     //fprintf(F, "%e ", max);
  143.     //fprintf(F, "%e ", max2); //р-к
  144. }
  145. void main()
  146. {
  147.     long double a = 0, b = 1.5;
  148.     long double e;
  149.     long double l = 0.01;
  150.     long double h = (b - a) / (double) N;
  151.     FILE *f;
  152.     f = fopen("file3.txt", "a");
  153.     masx(h, a, b);
  154.     /*e = 0.1;
  155.     for (int i = 0; i < 10; i++)
  156.     {
  157.         fprintf(f, "%e ", e);
  158.         e *= 0.1;
  159.     }
  160.     fprintf(f, "\n");*/
  161.     //e = pow(10, -10);
  162.     e = 0.1;
  163.     fprintf(f, "\n");
  164.     for (int i = 0; i < 10; i++)
  165.     {
  166.         adams1(e, a, b, h, start, f);
  167.         l *= 0.1;
  168.         e *= 0.1;
  169.     }
  170.     //fprintf(f, "\n");
  171.     fclose(f);
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement