Advertisement
yahorrr

Untitled

Dec 24th, 2022
1,305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.66 KB | None | 0 0
  1. #include <iostream>
  2. #include "erfinv.h"
  3. using IntegralFunction = double(*)(double);
  4. using QuadratureFormula = double(*)(double, double, unsigned, IntegralFunction);
  5.  
  6. double Trapezoid(double, double, unsigned, IntegralFunction);
  7. double Simpson(double, double, unsigned, IntegralFunction);
  8. double LeftRectangle(double, double, unsigned, IntegralFunction);
  9. double RightRectangle(double, double, unsigned, IntegralFunction);
  10. double MiddleRectangle(double, double, unsigned, IntegralFunction);
  11. double DoubleConverting(double, double, double, unsigned, IntegralFunction, QuadratureFormula);
  12.  
  13. int main()
  14. {
  15.     auto input = [](const char* enterMessage, const char* errorMessage, int leftBorder, int rightBorder)
  16.     {
  17.         int value;
  18.         while (true)
  19.         {
  20.             std::cout << enterMessage << std::endl;
  21.             std::cin >> value;
  22.             if (value >= leftBorder && value <= rightBorder)
  23.             {
  24.                 system("cls");
  25.                 return value;
  26.             }
  27.             std::cout << errorMessage << std::endl;
  28.             system("pause");
  29.             system("cls");
  30.         }
  31.     };
  32.  
  33.     int variant = input("To calculate the error function press 1\nTo To calculate integral of the inverse error function press 2", "Invalid variant. Try again.", 1, 2);
  34.  
  35.     IntegralFunction function = nullptr;
  36.     double BeginSegm = 0, EndSegm = 1, Epsilon = 0.5E-2;
  37.     const double PI = atan(1) * 4;
  38.     const char* functionName = nullptr;
  39.     switch (variant)
  40.     {
  41.     case 0: function = [](double x) { return (double)erfinv(x); };
  42.         Epsilon = 0.5E-2;
  43.         functionName = "erfinv(x)", BeginSegm = 0, EndSegm = 0.99;
  44.         break;
  45.     case 1: function = [](double x) { return exp(-x * x) * 2 / sqrt(atan(1) * 4); };
  46.         Epsilon = 0.5E-2;
  47.         functionName = "erf(x)";
  48.         break;
  49.     default:
  50.         break;
  51.     }
  52.     unsigned partitionNumber = 2;
  53.  
  54.     int method = input("Choose the method to calculate the integral:\n1 - LeftRectangle\n2 - RightRectangle\n3 - MiddleRectangle\n4 - Trapezoid\n5 - Simpson", "Error. Invalid method. Try again.", 1, 5);
  55.  
  56.     QuadratureFormula formula = nullptr;
  57.     switch (method)
  58.     {
  59.     case 1: formula = LeftRectangle;
  60.         break;
  61.     case 2: formula = RightRectangle;
  62.         break;
  63.     case 3: formula = MiddleRectangle;
  64.         break;
  65.     case 4: formula = Trapezoid;
  66.         break;
  67.     case 5: formula = Simpson;
  68.         break;
  69.     }
  70.  
  71.     double Integral = DoubleConverting(BeginSegm, EndSegm, Epsilon, partitionNumber, function, formula);
  72.     std::cout << "\nThe value of integral of " << functionName << " calcucated using formula on segment ["
  73.         << BeginSegm << ", " << EndSegm << "] is equal to " << Integral << " (accuracy = " << Epsilon << ")\n";
  74.  
  75.     return 0;
  76. }
  77.  
  78. double LeftRectangle(double LowerLimit, double UpperLimit, unsigned partitionNumber, IntegralFunction function) {
  79.     double result = 0;
  80.     double step = (UpperLimit - LowerLimit) / partitionNumber;
  81.     for (double t = LowerLimit; t < UpperLimit; t += step)
  82.         result += function(t);
  83.     return result * step;
  84. }
  85.  
  86. double RightRectangle(double LowerLimit, double UpperLimit, unsigned partitionNumber, IntegralFunction function) {
  87.     double result = 0;
  88.     double step = (UpperLimit - LowerLimit) / partitionNumber;
  89.     if (step)
  90.         for (double t = LowerLimit + step; t <= UpperLimit; t += step)
  91.             result += function(t);
  92.     return result * step;
  93. }
  94.  
  95. double MiddleRectangle(double LowerLimit, double UpperLimit, unsigned partitionNumber, IntegralFunction function) {
  96.     double result = 0;
  97.     double step = (UpperLimit - LowerLimit) / partitionNumber;
  98.     for (double t = LowerLimit; t < UpperLimit; t += step)
  99.         result += function(t + step / 2);
  100.     return result * step;
  101. }
  102.  
  103. double Trapezoid(double LowerLimit, double UpperLimit, unsigned partitionNumber, IntegralFunction function) {
  104.     double result = 0;
  105.     double step = (UpperLimit - LowerLimit) / partitionNumber;
  106.     for (double t = LowerLimit + step; t < UpperLimit; t += step)
  107.         result += function(t);
  108.     result *= 2;
  109.     result += function(LowerLimit) + function(UpperLimit);
  110.     return result * step / 2;
  111. }
  112.  
  113. double Simpson(double LowerLimit, double UpperLimit, unsigned partitionNumber, IntegralFunction function) {
  114.     double result = 0, buff = 0;
  115.     double step = (UpperLimit - LowerLimit) / partitionNumber;
  116.     for (double t = LowerLimit + 2 * step; t < UpperLimit - step; t += step)
  117.         buff += function(t);
  118.     buff *= 2;
  119.     for (double t = LowerLimit + step; t < UpperLimit; t += step)
  120.         result += function(t);
  121.     result *= 4;
  122.     result += function(LowerLimit) + buff + function(UpperLimit);
  123.     return result * step / 6;
  124. }
  125.  
  126. double DoubleConverting(double BeginSegm, double EndSegm, double Epsilon,
  127.     unsigned partitionNumber, IntegralFunction function, QuadratureFormula formula) {
  128.     double PreviousIntegral, NextIntegral;
  129.     do {
  130.         PreviousIntegral = formula(BeginSegm, EndSegm, partitionNumber, function);
  131.         NextIntegral = formula(BeginSegm, EndSegm, 2 * partitionNumber, function);
  132.         partitionNumber *= 2;
  133.     } while (fabs(PreviousIntegral - NextIntegral) > Epsilon);
  134.     return NextIntegral;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement