vadimk772336

Untitled

Nov 28th, 2019
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <cmath>
  4. #include <vector>
  5. #include <Windows.h>
  6. #include <stdlib.h>
  7. #include <fstream>
  8. #include <string.h>
  9. using namespace std;
  10.  
  11. typedef double(*functiontype)(double x);
  12.  
  13. typedef struct Node
  14. {
  15.     double x, y;
  16. } Node;
  17.  
  18. typedef double(*method)(double x, Node* Array, int Count, double* DD_massiv);
  19.  
  20. typedef struct Interval
  21. {
  22.     double InitialNode, EndNode;
  23. } Interval;
  24.  
  25.  
  26.  
  27. void ValueUniformTable(functiontype* f, Node* Array, double Initial, double End,
  28.     int CountNodes) // Точек на 1 больше чем отрезков, массив
  29. // хранит все точки (их пары образуют
  30. // отрезки)
  31. { // Создание равномерной таблицы значений
  32.     double step = abs(Initial - End) / (CountNodes - 1);
  33.     Array[0].x = Initial;
  34.     Array[0].y = (*f)(Array[0].x);
  35.     for (int i = 1; i < CountNodes; i++)
  36.     {
  37.         Array[i].x = Array[i - 1].x + step;
  38.         Array[i].y = (*f)(Array[i].x);
  39.     }
  40. }
  41.  
  42. double Myfunc(double x)
  43. {
  44.     return (x * (sqrt(4 - x * x)));
  45. }
  46.  
  47.  
  48. double trapezoid_formula(Node* Array, functiontype* f, int CountSegments)
  49. { //Теор. порядок точности = 2
  50.     int i;
  51.     double area = 0;
  52.  
  53.     for (i = 0; i < CountSegments; i++)
  54.         area += (Array[i + 1].x - Array[i].x) * ((*f)(Array[i + 1].x) + (*f)(Array[i].x)) / 2;
  55.     return area;
  56. }
  57.  
  58. double Gauss_formula(Node* Array, functiontype* f, int CountSegments)
  59. { //Теор. порядок точности = 4
  60.  
  61.     /*порядок точности составной квадратурной формулы Гаусса по n узлам равен 2n.
  62.   стр 216
  63.   квадр формула Гаусс точно на полиномах степени 2n-1 стр 209
  64.   211 стр формула погр
  65.   Алгебраическая степень точности квадратурной формулы, построенной по n узлам,
  66.   не может превосходить 2n−1.
  67.   Как следствие, если производные подинтегральной функции не рас-
  68.   тут «слишком быстро» с ростом их порядка, то при увеличении числа
  69.  
  70.   узлов и гладкости интегрируемой функции порядок точности квадра-
  71.   турных формул Гаусса может быть сделан сколь угодно высоким.
  72.   202 стр теорема*/
  73.     int i;
  74.     double x1, x2, area = 0;
  75.     for (i = 0; i < CountSegments; i++)
  76.     {
  77.         x1 = (Array[i + 1].x + Array[i].x) / 2 + (Array[i + 1].x - Array[i].x) * sqrt(3) / 6;
  78.         x2 = (Array[i + 1].x + Array[i].x) / 2 - (Array[i + 1].x - Array[i].x) * sqrt(3) / 6;
  79.         area += (Array[i + 1].x - Array[i].x) * ((*f)(x1) + (*f)(x2)) / 2;
  80.     }
  81.  
  82.     return area;
  83. }
  84.  
  85. void PrintNodes(Node* Array, int CountSegments)
  86. {
  87.     int i;
  88.     for (i = 0; i < CountSegments - 1; i++)
  89.         cout << "(" << (Array[i].x) << ":" << (Array[i + 1].x) << ")" << endl;
  90. }
  91.  
  92. double orig_integral(double Initial, double End)
  93. {
  94.     return (pow((4 - Initial * Initial), 1.5) - pow((4 - End * End), 1.5)) / 3;
  95. }
  96.  
  97. void get_mas_pract_error(functiontype* f, int CountSegments2, int CountSegments, Node* Array2,
  98.     Node* Array, double*& massiv_errors)
  99. {
  100.     int p_trap = 2, p_Gauss = 4;
  101.     double numerator_trap, numerator_Gauss, denominator_Gauss, denominator_Trap, x, practical_eror_trap,
  102.         practical_eror_trap2, practical_eror_Gauss;
  103.     double practical_eror_Gauss2, C_trap, C_Gauss;
  104.     functiontype Func = &Myfunc;
  105.     double z = CountSegments2, y = CountSegments;
  106.     double  step = 2 / y; //Пришлось так сделать чтобы дабл на
  107.     //дабл делился, а то если на инт то 0
  108.     //получается
  109.  
  110.     numerator_trap = (trapezoid_formula(Array2, &Func, CountSegments2)
  111.         - trapezoid_formula(Array, &Func, CountSegments))
  112.         * pow(2, p_trap);
  113.     numerator_Gauss = (Gauss_formula(Array2, &Func, CountSegments2)
  114.         - Gauss_formula(Array, &Func, CountSegments))
  115.         * pow(2, p_Gauss);
  116.     denominator_Gauss = pow(step, p_Gauss) * (pow(2, p_Gauss) - 1);
  117.     denominator_Trap = pow(step, p_trap) * (pow(2, p_trap) - 1);
  118.     C_trap = numerator_trap / denominator_Trap;
  119.     C_Gauss = numerator_Gauss / denominator_Gauss;
  120.     //cout << C_trap << "   " << C_Gauss;
  121.  
  122.     practical_eror_trap = C_trap * pow(step, p_trap);
  123.     //practical_eror_trap2 = C_trap * pow(step2, p_trap);
  124.     practical_eror_Gauss = C_Gauss * pow(step, p_Gauss);
  125.     //practical_eror_Gauss2 = C_Gauss * pow(step2, p_Gauss);
  126.  
  127.     massiv_errors[0] = practical_eror_trap;
  128.     // massiv_errors[1] = practical_eror_trap2;
  129.     massiv_errors[1] = practical_eror_Gauss;
  130.     // massiv_errors[3] = practical_eror_Gauss2;
  131.  
  132.     // cout <<  " numerator: " << numerator <<   " denominator: " <<  denominator
  133.     // << endl;
  134. }
  135.  
  136. int main()
  137. {
  138.     setlocale(LC_ALL, "RUS");
  139.     Interval Interval;
  140.     int CountSegments, MyNodes = 5000;
  141.     double C_Trap, C_Gauss;
  142.     double orig_square_exp, R_G, R_G2, R_T, R_T2, exp_p_G, exp_p_T;
  143.     double Gauss_square_exp, Gauss_square_exp2, trapezoid_square_exp, trapezoid_square_exp2;
  144.     functiontype Func = &Myfunc;
  145.     cout << "Введите число интервалов разбиения: " << endl;
  146.     cin >> CountSegments;
  147.     cout << endl;
  148.     double CountNodes = CountSegments + 1;
  149.     Interval.InitialNode = 0;
  150.     Interval.EndNode = 2;
  151.  
  152.     Node* ArrayUniformNodes = new Node[CountNodes];
  153.     ValueUniformTable(&Func, ArrayUniformNodes, Interval.InitialNode, Interval.EndNode, CountNodes);
  154.  
  155.     cout << "Разбиение интервала на равные отрезки интегрирования:" << endl;
  156.     PrintNodes(ArrayUniformNodes, CountNodes);
  157.     cout << endl;
  158.  
  159.     cout << "Значение интеграла через формулу трапеций:" << endl;
  160.     double trapezoid_square = trapezoid_formula(ArrayUniformNodes, &Func, CountSegments);
  161.     cout << trapezoid_square << endl << endl;
  162.  
  163.     cout << "Значение интеграла через формулу Гаусса по 2 узлам:" << endl;
  164.     double Gauss_square = Gauss_formula(ArrayUniformNodes, &Func, CountSegments);
  165.     cout << Gauss_square << endl << endl;
  166.  
  167.     cout << "Значение интеграла:" << endl;
  168.     double orig_square = orig_integral(Interval.InitialNode, Interval.EndNode);
  169.     cout << orig_square << endl << endl;
  170.  
  171.     cout << "Разность между значениям интеграла и значением по формуле Гаусса:" << endl;
  172.     cout << abs(orig_square - Gauss_square) << endl << endl;
  173.  
  174.     cout << "Разность между значениям интеграла и значением по формуле Трапеций:" << endl;
  175.     cout << abs(orig_square - trapezoid_square) << endl << endl;
  176.  
  177.     /* -----------------Реализация правила Рунге-----------------------------*/
  178.     double* massiv_errors = new double[2];
  179.     Node* Array2Nodes = new Node[2*CountSegments+1];
  180.     Node* ArrayNodes = new Node[CountNodes];
  181.     ValueUniformTable(&Func, Array2Nodes, Interval.InitialNode, Interval.EndNode, 2 * CountSegments + 1);
  182.     ValueUniformTable(&Func, ArrayNodes, Interval.InitialNode, Interval.EndNode, CountNodes);
  183.     get_mas_pract_error(&Func, 2 * CountSegments, CountSegments, Array2Nodes, ArrayNodes, massiv_errors);
  184.     cout << "Практ. оценка погр. для разбиения на " << CountSegments << " частей по формуле трапеций:" << endl;
  185.     cout << massiv_errors[0] << endl << endl;
  186.     cout << "Практ. оценка погр. для разбиения на " << CountSegments << " частей по формуле Гаусса:" << endl;
  187.     cout << massiv_errors[1] << endl << endl;
  188.  
  189.     // cout << "C_Trap2 = " << massiv_errors[1] << endl << endl;
  190.     // cout << "C_Gauss2 = " << massiv_errors[3] << endl << endl;
  191.     /* -----------------------Конец Рунге-----------------------------------*/
  192.  
  193.     /* -----------------Экспериментальный порядок точности   -----------------------------*/
  194.  
  195.     Gauss_square_exp = Gauss_formula(ArrayNodes, &Func, CountSegments);
  196.     Gauss_square_exp2 = Gauss_formula(Array2Nodes, &Func, 2 * CountSegments);
  197.     trapezoid_square_exp = trapezoid_formula(ArrayNodes, &Func, CountSegments);
  198.     trapezoid_square_exp2 = trapezoid_formula(Array2Nodes, &Func, 2 * CountSegments);
  199.  
  200.     orig_square_exp = orig_integral(Interval.InitialNode, Interval.EndNode);
  201.  
  202.     R_G = abs(orig_square_exp - Gauss_square_exp);
  203.     R_G2 = abs(orig_square_exp - Gauss_square_exp2);
  204.     R_T = abs(orig_square_exp - trapezoid_square_exp);
  205.     R_T2 = abs(orig_square_exp - trapezoid_square_exp2);
  206.  
  207.     exp_p_G = log(R_G / R_G2) / log(2) ;
  208.     exp_p_T = log(R_T / R_T2) / log(2) ;
  209.  
  210.     cout << "Эксперим. порядок точности для формул Гаусса и Трапеций соответственно:" << endl;
  211.     cout << exp_p_G << " " << exp_p_T << endl << endl;
  212.     /* -------------------------   Конец --------------------------------------*/
  213.  
  214.     cout << endl;
  215.     system("pause");
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment