Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <math.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <limits.h>
- #include <vector>
- #define start 1
- #define N 15
- #pragma warning (disable:4996)
- using namespace std;
- long double yy[N+1];
- long double xx[N+1];
- long double p(long double e)
- {
- int random;
- random = 1 + rand() % 20000;
- return e*random*0.001;
- }
- void masx(double h, double a, double b)
- {
- for (int i = 0; i <= N; i++)
- {
- xx[i] = a + h*i;
- }
- }
- long double fact(long double x)
- {
- return (sin(x) + cos(x));
- }
- long double f(long double x, long double y)
- {
- return ((1 / cos(x)) - y*(sin(x) / cos(x)));
- }
- long double calc(long double x, long double y, long double h)
- {
- long double yy;
- long double ff;
- ff = f(x, y);
- yy = y + h*ff;
- return (y + h*(ff + f(x + h, yy)) / 2);
- }
- int k=1; //количество отрезков, h - длина одного
- long double hh;
- vector<pair<long double, long double>> RK(long double e, long double a, long double b, long double y) //возвращает значение для точки с заданной точностью
- {
- vector<pair<long double, long double>> vec;
- long double y0_1, y0_2, y1, y2;
- k = 1;
- do
- {
- hh = 0;
- vec.clear();
- y0_1 = y;
- y0_2 = y;
- vec.push_back(make_pair(a, y0_2));
- long double h = (b - a) / k;
- for (int i = 0; i < k; i++)
- {
- y1 = calc(a + i*h, y0_1, h);
- //y1 = y0_1 + (h / 2.0)*(f(a + (i+1)*h, y1) + f(a + i*h, y0_1));
- y0_1 = y1;
- }
- for (int j = 0; j < 2 * k; j++)
- {
- y2 = calc(a + (j*h) / 2, y0_2, h / 2);
- vec.push_back(make_pair(a + ((j+1)*h) / 2, y2));
- //y2 = y0_2 + (h / 4.0)*(f(a + (j + 1)*h, y1) + f(a + j*h, y0_2));
- y0_2 = y2;
- }
- k *= 2;
- hh = h / 2;
- } while (fabs((y1 - y2)) > e);
- return vec;
- }
- void adams(long double e, long double a, long double b, long double h, long double y_start, FILE *F)
- {
- int maxx = 0;
- int min = INT_MAX;
- long double max=0;
- long double max2 = 0;
- yy[0] = y_start;
- for (int n = 1; n <= N; n++)
- {
- vector <pair<long double, long double>> yyy = RK(e, xx[n - 1], xx[n], yy[n - 1]); //по р-к находится точка
- if (k < min) min = k;
- if (k > maxx) maxx = k;
- long double pogr2 = fabs(yyy[yyy.size() - 1].second - fact(xx[n]));
- if (max2 < pogr2) max2 = pogr2;
- for (unsigned int i = 1; i < yyy.size(); i++)
- {
- 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));
- }
- yy[n] = yyy[yyy.size() - 1].second;
- long double pogr = fabs(fact(xx[n]) - yy[n]);
- if (max < pogr) max = pogr;
- }
- //fprintf(F, "%i ", min);
- printf("%e ", max);
- printf("%e \n", max2);
- //fprintf(F, "%e ", max);
- //fprintf(F, "%e ", max2); //р-к
- }
- long double RK1(long double e, long double a, long double b, long double y) //возвращает значение для точки с заданной точностью
- {
- long double y0_1, y0_2, y1, y2;
- do
- {
- y0_1 = y;
- y0_2 = y;
- long double h = (b - a) / k;
- for (int i = 0; i < k; i++)
- {
- y1 = calc(a + i*h, y0_1, h);
- y1 = y0_1 + (h / 2.0)*(f(a + (i + 1)*h, y1) + f(a + i*h, y0_1));
- y0_1 = y1;
- }
- for (int j = 0; j < 2 * k; j++)
- {
- y2 = calc(a + (j*h) / 2, y0_2, h / 2);
- y2 = y0_2 + (h / 4.0)*(f(a + (j + 1)*h, y1) + f(a + j*h, y0_2));
- y0_2 = y2;
- }
- k *= 2;
- } while (fabs((y1 - y2)) > e);
- k = 1;
- return y2;
- }
- void adams1(long double e, long double a, long double b, long double h, long double y_start, FILE *F)
- {
- int maxx = 0;
- int min = INT_MAX;
- long double max = 0;
- yy[0] = y_start;
- for (int n = 1; n <= N; n++)
- {
- yy[n] = RK1(e, xx[n-1], xx[n], yy[n-1]);
- long double pogr = fabs(fact(xx[n]) - yy[n]);
- if (max < pogr) max = pogr;
- }
- //fprintf(F, "%i ", min);
- printf("%e ", max);
- //fprintf(F, "%e ", max);
- //fprintf(F, "%e ", max2); //р-к
- }
- void main()
- {
- long double a = 0, b = 1.5;
- long double e;
- long double l = 0.01;
- long double h = (b - a) / (double) N;
- FILE *f;
- f = fopen("file3.txt", "a");
- masx(h, a, b);
- /*e = 0.1;
- for (int i = 0; i < 10; i++)
- {
- fprintf(f, "%e ", e);
- e *= 0.1;
- }
- fprintf(f, "\n");*/
- //e = pow(10, -10);
- e = 0.1;
- fprintf(f, "\n");
- for (int i = 0; i < 10; i++)
- {
- adams1(e, a, b, h, start, f);
- l *= 0.1;
- e *= 0.1;
- }
- //fprintf(f, "\n");
- fclose(f);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement