Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.37 KB | None | 0 0
  1.  
  2.  
  3.  
  4. #include <iostream>
  5. #include <cmath>
  6. #include <iomanip>
  7. using namespace std;
  8.  
  9. const int n = 3;
  10. const int N = 51;
  11.  
  12. const int steps =51;
  13.  
  14. double Function(double x)
  15. {
  16.     return sin(x)*(x+1);
  17. }
  18.  
  19.  
  20.  
  21. double SimpsonsIntegrate(double step, int steps, double y[])
  22. {
  23.     double sumEven = 0.0, sumOdd = 0.0;
  24.     for (int i = 1; i < steps; i += 2)
  25.         if (!(i == steps - 1))
  26.             sumOdd += y[i];
  27.         else
  28.             break;
  29.     for (int i = 2; i < steps - 1; i += 2)
  30.         sumEven += y[i];
  31.     return step / 3 * (y[0] + 2 * sumEven + 4 * sumOdd + y[steps]);
  32. }
  33.  
  34.  
  35. double f(double x)
  36. {
  37.     return sin(x)*(x + 1) ;
  38. }
  39.  
  40. double Gauss(double a, double b)
  41. {
  42.     const double Xi[n] = { -0.7745967,0,0.7745967 };
  43.     const double Ci[n] = { 0.5555556,0.8888889,0.5555556 };
  44.    
  45.     double ra = (b - a) / 2;
  46.     double su = (a + b) / 2;
  47.     double Q, S = 0.0;
  48.     for (int i = 0; i < n; i++)
  49.     {
  50.         Q = su + ra*Xi[i];
  51.         S += Ci[i] * f(Q);
  52.     }
  53.     return ra*S;
  54. }
  55.  
  56. int main()
  57. {
  58.     cout<<"=================================================================\n\n";
  59.     cout<<"\t\t\t Вхідні дані\n";
  60.     cout<<"\t\t\t ~~~~~~~~~~~\n\n";
  61.     cout<<"Функція f(x)=(x+1)*sin(x)\n";
  62.     cout<<"Межі інтегрування:\na = -2 \nb = 3\n";
  63.     cout<<"Точність Е = 0.0001\n\n";
  64.      cout<<"=================================================================\n\n";
  65.     cout<<"\t\t\t Метод Сімпсона\n";
  66.     cout<<"\t\t\t ~~~~~~~~~~~~~~~\n\n";
  67.  
  68.     double a = -2;
  69.     double b = 3;
  70.     double s = 0.0;
  71.    
  72.     double y111 = 1;
  73.     double n = 1;
  74.     while(0.0001 <= y111){
  75.         y111 = (pow(3+2, 2)) / (180*pow(2*n, 4)) * 56.717;
  76.         n++;
  77.        
  78.     }
  79.     cout << "Мінімальна к-ть кроків, обчислена за формулою оцінки похибки Сімпсона: " <<  n << endl;
  80.    
  81.     double *y = new double[steps + 1];
  82.     double *segments = new double[steps + 1];
  83.     double step = (b - a) / steps;
  84.     double tmp = a;
  85.    
  86.     cout << "Крок виконання: " << step << endl;
  87.     for (int i = 0; i <= steps; i++)
  88.     {
  89.         segments[i] = tmp;
  90.         tmp += step;
  91.     }
  92.     for (int i = 0; i <= steps; i++)
  93.         y[i] = Function(segments[i]);
  94.     cout << "\t\t\t\t\tX \t\t Y" << endl;
  95.     for (int i = 0; i < steps + 1; i++)
  96.     {
  97.         cout <<i+1<< " ітерація : " <<setw(10)<<segments[i] << setw(11) << y[i] << endl;
  98.     }
  99.    
  100.     cout<<"-----------------------------------------------------------------\n\n";
  101.     cout << "Знайдений за методом Сімпсона інтеграл з кількістю кроків "<<steps+1<<" : " << SimpsonsIntegrate(step, steps, y);
  102.     cout<<"\n\n=================================================================\n";
  103.     for (int i = 0; i < N; ++i)
  104.     {
  105.         s += Gauss(a + i*(b - a) / N, a + (i + 1)*(b - a) / N);
  106.     }
  107.     cout<<"\n\t\t\t Розв'язок за квадратурною формулою Гауса\n";
  108.     cout<<"\t\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
  109.    
  110.     cout << "\nЗнайдений за методом Гаусса інтеграл з кількістю кроків "<<3<<" : "  << s << endl;
  111.     cout<<"\n=================================================================\n";
  112.    
  113.     getchar();
  114.     return 0;
  115.    
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement