vadimk772336

Untitled

Dec 2nd, 2019
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.26 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. typedef struct Node
  13. {
  14.     double x, y;
  15. } Node;
  16. typedef double(*method)(double x, Node* Array, int Count, double* DD_massiv);
  17. typedef struct Interval
  18. {
  19.     double InitialNode, EndNode;
  20. } Interval;
  21. void ValueUniformTable(functiontype* f, Node* Array, double Initial, double End, int CountNodes) // Точек на 1 больше чем отрезков, массив
  22. // хранит все точки (их пары образуют
  23. // отрезки)
  24. { // Создание равномерной таблицы значений
  25.     double step = abs(Initial - End) / (CountNodes - 1);
  26.     Array[0].x = Initial;
  27.     Array[0].y = (*f)(Array[0].x);
  28.     for (int i = 1; i < CountNodes; i++)
  29.     {
  30.         Array[i].x = Array[i - 1].x + step;
  31.         Array[i].y = (*f)(Array[i].x);
  32.     }
  33. }
  34. double Myfunc(double x)
  35. {
  36.     return (x * (sqrt(4 - x * x)));
  37. }
  38. functiontype Func = &Myfunc;
  39. double trapezoid_formula(Node* Array, functiontype* f, int CountSegments)
  40. { //Теор. порядок точности = 2
  41.     int i;
  42.     double area = 0;
  43.  
  44.     for (i = 0; i < CountSegments - 1; i++) {
  45.         area += (Array[i + 1].x - Array[i].x) * ((*f)(Array[i + 1].x) + (*f)(Array[i].x)) / 2;
  46.     }
  47.     return area;
  48. }
  49. double Gauss_formula(Node* Array, functiontype* f, int CountSegments)
  50. { //Теор. порядок точности = 4
  51.  
  52.     /*порядок точности составной квадратурной формулы Гаусса по n узлам равен 2n.
  53.   стр 216
  54.   квадр формула Гаусс точно на полиномах степени 2n-1 стр 209
  55.   211 стр формула погр
  56.   Алгебраическая степень точности квадратурной формулы, построенной по n узлам,
  57.   не может превосходить 2n−1.
  58.   Как следствие, если производные подинтегральной функции не рас-
  59.   тут «слишком быстро» с ростом их порядка, то при увеличении числа
  60.  
  61.   узлов и гладкости интегрируемой функции порядок точности квадра-
  62.   турных формул Гаусса может быть сделан сколь угодно высоким.
  63.   202 стр теорема*/
  64.     int i;
  65.     double x1, x2, area = 0;
  66.     for (i = 0; i < CountSegments - 1; i++)
  67.     {
  68.         x1 = (Array[i + 1].x + Array[i].x) / 2 + (Array[i + 1].x - Array[i].x) * sqrt(3) / 6;
  69.         x2 = (Array[i + 1].x + Array[i].x) / 2 - (Array[i + 1].x - Array[i].x) * sqrt(3) / 6;
  70.         area += (Array[i + 1].x - Array[i].x) * ((*f)(x1) + (*f)(x2)) / 2;
  71.     }
  72.  
  73.     return area;
  74. }
  75. double orig_integral(double Initial, double End)
  76. {
  77.     return (pow((4 - Initial * Initial), 1.5) - pow((4 - End * End), 1.5)) / 3;
  78. }
  79.  
  80. void get_order_accuracy(int CountSegments, functiontype* f, double Initial, double End, double* massiv_exp_accuracy) {
  81.     /*ofstream Trap_File("D:/exp_accuracy_T.txt");
  82.     ofstream Gauss_File("D:/exp_accuracy_T.txt");*/
  83.  
  84.     double orig_square_exp, R_G, R_G2, R_T, R_T2, exp_p_G, exp_p_T;
  85.     double Gauss_square_exp, Gauss_square_exp2, trapezoid_square_exp, trapezoid_square_exp2;
  86.  
  87.  
  88.     Node* Array2Nodes = new Node[2 * CountSegments + 1];
  89.     Node* ArrayNodes = new Node[CountSegments + 1];
  90.     ValueUniformTable(f, Array2Nodes, Initial, End, 2 * CountSegments + 1);
  91.     ValueUniformTable(f, ArrayNodes, Initial, End, CountSegments + 1);
  92.     Gauss_square_exp = Gauss_formula(ArrayNodes, f, CountSegments);
  93.     Gauss_square_exp2 = Gauss_formula(Array2Nodes, f, 2 * CountSegments);
  94.     trapezoid_square_exp = trapezoid_formula(ArrayNodes, f, CountSegments);
  95.     trapezoid_square_exp2 = trapezoid_formula(Array2Nodes, f, 2 * CountSegments);
  96.     orig_square_exp = orig_integral(Initial, End);
  97.  
  98.     R_G = abs(orig_square_exp - Gauss_square_exp);
  99.     R_G2 = abs(orig_square_exp - Gauss_square_exp2);
  100.     R_T = abs(orig_square_exp - trapezoid_square_exp);
  101.     R_T2 = abs(orig_square_exp - trapezoid_square_exp2);
  102.  
  103.     exp_p_G = log(R_G / R_G2) / log(2);
  104.     exp_p_T = log(R_T / R_T2) / log(2);
  105.  
  106.     /*Trap_File << CountSegments << " " << exp_p_T;
  107.     Gauss_File << CountSegments << " " << exp_p_G;*/
  108.  
  109.     massiv_exp_accuracy[0] = exp_p_T;
  110.     massiv_exp_accuracy[1] = exp_p_G;
  111.  
  112. }
  113.  
  114. void graphic_exp(functiontype* f, double Initial, double End, double* massiv_exp_accuracy) {
  115.     ofstream Trap_File("D:/exp_accuracy_T.txt");
  116.     ofstream Gauss_File("D:/exp_accuracy_T.txt");
  117.     double* massiv_exp_accuracy = new double[2];
  118.     for (int n = 1; n < 1000; n + 5) {
  119.         get_order_accuracy(n, f, Initial, End, massiv_exp_accuracy);
  120.         Trap_File << n << " " << massiv_exp_accuracy[0];
  121.         Gauss_File << n << " " << massiv_exp_accuracy[1];
  122.     }
  123.  
  124. }
  125.  
  126. void PrintNodes(Node* Array, int CountSegments)
  127. {
  128.     int i;
  129.     for (i = 0; i < CountSegments - 1; i++)
  130.         cout << "(" << (Array[i].x) << ":" << (Array[i + 1].x) << ")" << endl;
  131. }
  132.  
  133. void get_mas_pract_error(functiontype* f, int CountSegments4, Node* Array4, int CountSegments2, int CountSegments, Node* Array2, Node* Array, double*& massiv_data)
  134. {
  135.     functiontype Func = &Myfunc;
  136.     int p_trap = 2, p_Gauss = 4;
  137.     double numerator_trap, numerator_Gauss, denominator_Gauss, denominator_Trap, R_trap, R_Gauss;
  138.     double our_numerator_trap, our_numerator_Gauss, our_denominator_Gauss, our_denominator_trap, our_accuracy_trap, our_accuracy_Gauss;
  139.     double y = CountSegments, step = 2 / y;
  140.  
  141.     numerator_trap = (trapezoid_formula(Array2, &Func, CountSegments2) - trapezoid_formula(Array, &Func, CountSegments)) * pow(2, p_trap);
  142.     numerator_Gauss = (Gauss_formula(Array2, &Func, CountSegments2) - Gauss_formula(Array, &Func, CountSegments)) * pow(2, p_Gauss);
  143.  
  144.     our_numerator_trap = abs(trapezoid_formula(Array2, &Func, CountSegments2) - trapezoid_formula(Array, &Func, CountSegments));
  145.     our_numerator_Gauss = abs(Gauss_formula(Array2, &Func, CountSegments2) - Gauss_formula(Array, &Func, CountSegments));
  146.     our_denominator_Gauss = abs(Gauss_formula(Array2, &Func, CountSegments2) - Gauss_formula(Array4, &Func, CountSegments4));
  147.     our_denominator_trap = abs(trapezoid_formula(Array2, &Func, CountSegments2) - trapezoid_formula(Array4, &Func, CountSegments4));
  148.  
  149.     denominator_Gauss = (pow(2, p_Gauss) - 1);
  150.     denominator_Trap = (pow(2, p_trap) - 1);
  151.     R_trap = numerator_trap / denominator_Trap;
  152.     R_Gauss = numerator_Gauss / denominator_Gauss;
  153.  
  154.     our_accuracy_trap = log(our_numerator_trap / our_denominator_trap) / log(2);
  155.     our_accuracy_Gauss = log(our_numerator_Gauss / our_denominator_Gauss) / log(2);
  156.  
  157.     massiv_data[0] = R_trap;
  158.     massiv_data[1] = R_Gauss;
  159.     massiv_data[2] = our_accuracy_trap;
  160.     massiv_data[3] = our_accuracy_Gauss;
  161.  
  162. }
  163.  
  164. int main()
  165. {
  166.     setlocale(LC_ALL, "RUS");
  167.     Interval Interval;
  168.     int CountSegments, MyNodes = 5000;
  169.     double C_Trap, C_Gauss;
  170.     double orig_square_exp, R_G, R_G2, R_T, R_T2, exp_p_G, exp_p_T;
  171.     double Gauss_square_exp, Gauss_square_exp2, trapezoid_square_exp, trapezoid_square_exp2;
  172.     functiontype Func = &Myfunc;
  173.     cout << "Введите число интервалов разбиения: " << endl;
  174.     cin >> CountSegments;
  175.     cout << endl;
  176.     double CountNodes = CountSegments + 1;
  177.     Interval.InitialNode = 0;
  178.     Interval.EndNode = 2;
  179.  
  180.     Node* ArrayUniformNodes = new Node[CountNodes];
  181.     ValueUniformTable(&Func, ArrayUniformNodes, Interval.InitialNode, Interval.EndNode, CountNodes);
  182.  
  183.     /*cout << "Разбиение интервала на равные отрезки интегрирования:" << endl;
  184.     PrintNodes(ArrayUniformNodes, CountNodes);
  185.     cout << endl;*/
  186.  
  187.     cout << "Трапеция:" << endl;
  188.     double trapezoid_square = trapezoid_formula(ArrayUniformNodes, &Func, CountSegments);
  189.     cout << trapezoid_square << endl << endl;
  190.  
  191.     cout << "Гаусс:" << endl;
  192.     double Gauss_square = Gauss_formula(ArrayUniformNodes, &Func, CountSegments);
  193.     cout << Gauss_square << endl << endl;
  194.  
  195.     cout << "Интеграл:" << endl;
  196.     double orig_square = orig_integral(Interval.InitialNode, Interval.EndNode);
  197.     cout << orig_square << endl << endl;
  198.  
  199.     cout << "Разность между значениям интеграла и значением по формуле Гаусса:" << endl;
  200.     cout << abs(orig_square - Gauss_square) << endl << endl;
  201.  
  202.     cout << "Разность между значениям интеграла и значением по формуле Трапеций:" << endl;
  203.     cout << abs(orig_square - trapezoid_square) << endl << endl;
  204.  
  205.     /* -----------------Реализация правила Рунге для оценки погрешности-----------------------------*/
  206.     double* massiv_data = new double[4];
  207.     Node* Array4Nodes = new Node[4 * CountSegments + 1];
  208.     Node* Array2Nodes = new Node[2 * CountSegments + 1];
  209.     Node* ArrayNodes = new Node[CountSegments + 1];
  210.     ValueUniformTable(&Func, Array4Nodes, Interval.InitialNode, Interval.EndNode, 4 * CountSegments + 1);
  211.     ValueUniformTable(&Func, Array2Nodes, Interval.InitialNode, Interval.EndNode, 2 * CountSegments + 1);
  212.     ValueUniformTable(&Func, ArrayNodes, Interval.InitialNode, Interval.EndNode, CountSegments + 1);
  213.     get_mas_pract_error(&Func, 4 * CountSegments, Array4Nodes, 2 * CountSegments, CountSegments, Array2Nodes, ArrayNodes, massiv_data);
  214.     //PrintNodes(Array2Nodes, 2 * CountSegments + 1);
  215.  
  216.     cout << "Погрешность по Рунге для " << CountSegments << " частей по формуле трапеций:" << endl;
  217.     cout << massiv_data[0] << endl << endl;
  218.     cout << "Погрешность по Рунге для " << CountSegments << " частей по формуле Гаусса:" << endl;
  219.     cout << massiv_data[1] << endl << endl;
  220.     cout << "Точность по Антону " << CountSegments << " Трапеция" << endl;
  221.     cout << massiv_data[2] << endl << endl;
  222.     cout << "Точность по Антону " << CountSegments << " Гаусс" << endl;
  223.     cout << massiv_data[3] << endl << endl;
  224.     /* -----------------------Конец Рунге-----------------------------------*/
  225.  
  226.  
  227.     /* -----------------Экспериментальный порядок точности   -----------------------------*/
  228.     double* massiv_exp_accuracy = new double[2];
  229.     get_order_accuracy(CountSegments, &Func, Interval.InitialNode, Interval.EndNode, massiv_exp_accuracy);
  230.  
  231.     /*Gauss_square_exp = Gauss_formula(ArrayNodes, &Func, CountSegments);
  232.     Gauss_square_exp2 = Gauss_formula(Array2Nodes, &Func, 2 * CountSegments);
  233.     trapezoid_square_exp = trapezoid_formula(ArrayNodes, &Func, CountSegments);
  234.     trapezoid_square_exp2 = trapezoid_formula(Array2Nodes, &Func, 2 * CountSegments);
  235.  
  236.     orig_square_exp = orig_integral(Interval.InitialNode, Interval.EndNode);
  237.  
  238.     R_G = abs(orig_square_exp - Gauss_square_exp);
  239.     R_G2 = abs(orig_square_exp - Gauss_square_exp2);
  240.     R_T = abs(orig_square_exp - trapezoid_square_exp);
  241.     R_T2 = abs(orig_square_exp - trapezoid_square_exp2);
  242.  
  243.     exp_p_G = log(R_G / R_G2) / log(2);
  244.     exp_p_T = log(R_T / R_T2) / log(2);*/
  245.  
  246.     cout << "Эксп. Порядок точности для Гаусса и Трапеций соответственно:" << endl;
  247.     cout << massiv_exp_accuracy[1] << " " << massiv_exp_accuracy[0] << endl << endl;
  248.     /* -------------------------   Конец --------------------------------------*/
  249.  
  250.     cout << endl;
  251.     system("pause");
  252.     return 0;
  253. }
Advertisement
Add Comment
Please, Sign In to add comment