ostapdontstop

integrals.cpp

Nov 22nd, 2018
198
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*Реализация алгоритмов нахождения значения определённого интеграла методами:
  2. -Средних прямоугольников
  3. -Трапецй
  4. -Симпсона
  5. С примером использования*/
  6. #include <fstream>
  7. #include <cmath>
  8. using namespace std;
  9.  
  10. typedef double(*pointFunc)(double);
  11. typedef double(*integrateFunc)(pointFunc, double, double, int);
  12.  
  13. double rect (pointFunc f, double a, double b, int n);
  14. double trap (pointFunc f, double a, double b, int n);
  15. double simp (pointFunc f, double a, double b, int n);
  16.  
  17. struct {
  18.     char name[30];
  19.     integrateFunc f;
  20.     int cuadr;
  21. } funcs[3] = {
  22.     {"\nМетод прямоуг.", rect, 4},
  23.     {"\nМетод трапеций", trap, 4},
  24.     {"\nМетод симпсона", simp, 16}
  25. };
  26.  
  27.  
  28. struct task {
  29.     char name[20];
  30.     double a, b;
  31.     pointFunc f;
  32.  
  33.     double integrate (integrateFunc p, int n) {
  34.         return p (f, a, b, n);
  35.     }
  36.     void print (ostream& out) {
  37.         out << "Функция: y = " << name;
  38.         out << "\nОбласть интегрирования = [" << a << "; " << b << "]\n";
  39.     }
  40. };
  41.  
  42.  
  43. double f1(double x) {
  44.     return x*x*x*(x-1)+1;
  45. }
  46. double f2(double x) {
  47.     return cos(x * x);
  48. }
  49.  
  50. int main() {
  51.  
  52.     task t_1 = { "x^4 - x^3 + 1",
  53.                  -2 ,  2, f1 };
  54.  
  55.     task t_2 = { "cos(x^2)",
  56.                  -2.7, -1, f2 };
  57.  
  58.     ofstream fout("output.txt");
  59.  
  60.     double val_1[3];
  61.  
  62.  
  63.     double analyt = 84./5, err;
  64.     int n = 10;
  65.  
  66.     fout << "1.\n";
  67.     t_1.print(fout);
  68.     fout << "Аналитическое значение = " << analyt << endl;
  69.     fout << "\nКоличество разбиений отрезка = " << n << endl;
  70.     for (int i = 0; i < 3; ++i) {
  71.         val_1[i] = t_1.integrate(funcs[i].f, n);
  72.         fout << funcs[i].name << ": " << val_1[i];
  73.         err = fabs(analyt - val_1[i]);
  74.         fout << "\nПогрешность:\n" << err << " \t("
  75.             << err / fabs(analyt) * 100 << "%)\n";
  76.     }
  77.  
  78.     fout << "\n------\n\n2.\n";
  79.     t_2.print(fout);
  80.     n = 10;
  81.     fout << "\nКоличество разбиений отрезка = " << n << endl;
  82.     for (int i = 0; i < 3; ++i) {
  83.         val_1[i] = t_2.integrate(funcs[i].f, n);
  84.         fout << funcs[i].name << ": " << val_1[i];
  85.     }
  86.  
  87.     n = 20;
  88.     fout << "\n\nКоличество разбиений отрезка = " << n << endl;
  89.     double val_2[3];
  90.     for (int i = 0; i < 3; ++i) {
  91.         val_2[i] = t_2.integrate(funcs[i].f, n);
  92.         fout << funcs[i].name << ": " << val_2[i];
  93.     }
  94.  
  95.     fout << "\n------\n\nОценка погрешностей по Рунге:\n";
  96.     for (int i = 0; i < 3; ++i) {
  97.         fout << funcs[i].name;
  98.         fout << "\nПогрешность по Рунге:  "
  99.             << (val_2[i] - val_1[i]) / (funcs[i].cuadr-1);
  100.         fout << "\nПриближенное значение: "
  101.             << (funcs[i].cuadr*val_2[i] - val_1[i]) / (funcs[i].cuadr-1) << endl;
  102.     }
  103.  
  104.     fout.close();
  105.  
  106. }
  107.  
  108.  
  109. double rect (pointFunc f, double a, double b, int n) {
  110.     if (n == 0) return 0;
  111.     double h = (b - a) / n;
  112.     double x = a + h/2;
  113.     double sum = f(x);
  114.  
  115.     for (int i = 1; i < n; i++) {
  116.         x+= h;
  117.         sum+= f(x);
  118.     }
  119.     return sum * h;
  120. }
  121.  
  122. double trap (pointFunc f, double a, double b, int n) {
  123.     if (n == 0) return 0;
  124.     double h = (b - a) / n;
  125.     double x = a, sum = 0;
  126.  
  127.     for (int i = 1; i < n; i++ ) {
  128.         x+= h;
  129.         sum+= f(x);
  130.     }
  131.     sum+= (f(a) + f(b)) / 2;
  132.     return sum * h;
  133. }
  134.  
  135. double simp (pointFunc f, double a, double b, int n) {
  136.     if (n == 0) return 0;
  137.     double h = (b - a) / n;
  138.     double x = a;
  139.     double k1 = 0, k2 = 0, k3 = 0;
  140.  
  141.     for (int i = 1; i < n; i+= 2) {
  142.         k1+= f(x);
  143.         x+= h;
  144.         k2+= f(x);
  145.         x+= h;
  146.         k3+= f(x);
  147.     }
  148.     return h / 3 * (k1 + 4*k2 + k3);
  149. }
RAW Paste Data