Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <iomanip>
- using namespace std;
- const int n = 3;
- const int N = 51;
- const int steps =51;
- double Function(double x)
- {
- return sin(x)*(x+1);
- }
- double SimpsonsIntegrate(double step, int steps, double y[])
- {
- double sumEven = 0.0, sumOdd = 0.0;
- for (int i = 1; i < steps; i += 2)
- if (!(i == steps - 1))
- sumOdd += y[i];
- else
- break;
- for (int i = 2; i < steps - 1; i += 2)
- sumEven += y[i];
- return step / 3 * (y[0] + 2 * sumEven + 4 * sumOdd + y[steps]);
- }
- double f(double x)
- {
- return sin(x)*(x + 1) ;
- }
- double Gauss(double a, double b)
- {
- const double Xi[n] = { -0.7745967,0,0.7745967 };
- const double Ci[n] = { 0.5555556,0.8888889,0.5555556 };
- double ra = (b - a) / 2;
- double su = (a + b) / 2;
- double Q, S = 0.0;
- for (int i = 0; i < n; i++)
- {
- Q = su + ra*Xi[i];
- S += Ci[i] * f(Q);
- }
- return ra*S;
- }
- int main()
- {
- cout<<"=================================================================\n\n";
- cout<<"\t\t\t Вхідні дані\n";
- cout<<"\t\t\t ~~~~~~~~~~~\n\n";
- cout<<"Функція f(x)=(x+1)*sin(x)\n";
- cout<<"Межі інтегрування:\na = -2 \nb = 3\n";
- cout<<"Точність Е = 0.0001\n\n";
- cout<<"=================================================================\n\n";
- cout<<"\t\t\t Метод Сімпсона\n";
- cout<<"\t\t\t ~~~~~~~~~~~~~~~\n\n";
- double a = -2;
- double b = 3;
- double s = 0.0;
- double y111 = 1;
- double n = 1;
- while(0.0001 <= y111){
- y111 = (pow(3+2, 2)) / (180*pow(2*n, 4)) * 56.717;
- n++;
- }
- cout << "Мінімальна к-ть кроків, обчислена за формулою оцінки похибки Сімпсона: " << n << endl;
- double *y = new double[steps + 1];
- double *segments = new double[steps + 1];
- double step = (b - a) / steps;
- double tmp = a;
- cout << "Крок виконання: " << step << endl;
- for (int i = 0; i <= steps; i++)
- {
- segments[i] = tmp;
- tmp += step;
- }
- for (int i = 0; i <= steps; i++)
- y[i] = Function(segments[i]);
- cout << "\t\t\t\t\tX \t\t Y" << endl;
- for (int i = 0; i < steps + 1; i++)
- {
- cout <<i+1<< " ітерація : " <<setw(10)<<segments[i] << setw(11) << y[i] << endl;
- }
- cout<<"-----------------------------------------------------------------\n\n";
- cout << "Знайдений за методом Сімпсона інтеграл з кількістю кроків "<<steps+1<<" : " << SimpsonsIntegrate(step, steps, y);
- cout<<"\n\n=================================================================\n";
- for (int i = 0; i < N; ++i)
- {
- s += Gauss(a + i*(b - a) / N, a + (i + 1)*(b - a) / N);
- }
- cout<<"\n\t\t\t Розв'язок за квадратурною формулою Гауса\n";
- cout<<"\t\t\t ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
- cout << "\nЗнайдений за методом Гаусса інтеграл з кількістю кроків "<<3<<" : " << s << endl;
- cout<<"\n=================================================================\n";
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement