Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // f1 = -(3 * cos(x) * pow(sin(x), 2) / pow(1 + pow(sin(x), 3), 2)),
- // f2 = (3 * pow(sin(x), 3) / pow(1 + pow(sin(x), 3), 2)) - (6 * sin(x) * pow(cos(x), 2) / pow(1 + pow(sin(x), 3), 2)) + (18 * pow(cos(x), 2) * pow(sin(x), 4) / pow(1 + pow(sin(x), 3), 3));
- #include <iostream>
- #include <cmath>
- #include <iomanip>
- using namespace std;
- double f(double x) {
- return (1 / (1 + pow(sin(x), 3))); // наша функция
- };
- double F1(double x) {
- return (-(3 * cos(x) * pow(sin(x), 2) / pow(1 + pow(sin(x), 3), 2))); // первая производная функции
- };
- double F2(double x) {
- return(3 * sin(x) * pow(pow(sin(x), 3) + 1, -2) * (pow(sin(x), 2) + pow(cos(x), 2) * (6 * pow(sin(x), 3) * pow(pow(sin(x), 3) + 1, -1) - 2)));
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- int n; // количество прямоугольников
- const int N = 4; // для массива значений F1
- double a = 0, b = 3.14159, // отрезок
- M1, h, e = 0.0001, max = 0; // М1 - максимальное значение производной, h - шаг, е - заданная точность, max - переменная для хранения макс значения
- cout << "Метод прямоугольников \n\n";
- double x0 = 0, x1 = 0.703840003, x2 = 2.43775265, x3 = 3.141592654, // корни, найденные в маткаде
- f0 = F1(x0), f1 = F1(x1), f2 = F1(x2), f3 = trunc(F1(x3)); // значения F1(xi)
- double Fl2[] = { f0, f1, f2, f3 }; // массив значений F1
- for (int i = 1; i <= N; i++) { // находим максимальное значений
- if (max < abs(Fl2[i])) {
- max = abs(Fl2[i]);
- }
- };
- M1 = max;
- n = (M1 * pow((b - a), 2) / (2 * e)) + 1; // находим кол-во прямоугольников
- cout << "Разобьем отрезок на " << n << " равных частей\n";
- if ((M1 * pow((b - a), 2) / 2 * e) <= n) // если выполняется это условие, то находим шаг по формуле
- h = (b - a) / n;
- cout << "Шаг: " << h << "\n";
- double X;
- double sum = 0;
- for (int i = 1; i <= n; i++) { // считаем сумму значений функции в узловых точках
- X = a + h * i;
- sum += f(X);
- };
- double res = h * sum; // считаем значение интеграла как произведение шага и сумму значений функции
- cout << "Значение интеграла: " << res;
- cout << "\n\nМетод трапеций \n\n";
- x0 = 0.33900351274, x1 = 1.14242977325, x2 = 1.57079632679, x3 = 1.9991628803;
- double x4 = 2.8025891409;
- f0 = F2(x0), f1 = F2(x1), f2 = F2(x2), f3 = F2(x3);
- double f4 = F2(x4);
- double Fl1[] = { f0,f1,f2,f3,f4 };
- max = 0;
- for (int i = 0; i <= 6; i++) {
- if (max < abs(Fl1[i])) {
- max = abs(Fl1[i]);
- }
- }
- M1 = max;
- cout<<max<<endl;
- n = sqrt(pow((b - a), 3) * M1 / 12 / e)+1;
- cout << "Разобьем отрезок на " << n << " равных частей\n";
- h = (b - a) / n;
- cout << "Шаг: " << h << "\n";
- sum = 0;
- for (int i = 0; i <= n; i++) {
- X = a + h * i;
- if ((i == 0) || (i == n - 1)) sum += f(X) / 2;
- else sum += f(X);
- }
- res = h * sum;
- cout << "Значение интеграла:" << res;
- cout << "\n\nМетод Симпсона \n\n";
- x0 = 0.3345893674, x1 = 0.8086105384, x2 = 1.5707963268, x3 = 2.3329821152, x4=2.8070032862;
- f0 = 32.21683968749, f1 = -14.154799784, f2 = 1.5, f3 = -14.154799784, f4=32.2168396875;
- double Fl3[] = { f0,f1,f2,f3,f4 };
- max = 0;
- for (int i = 0; i <= 4; i++) {
- if (max < abs(Fl3[i])) {
- max = abs(Fl3[i]);
- }
- }
- double M4=max;
- n=pow((pow((b-a),5)*M4)/e/2880,0.25)+1;
- cout << "Разобьем отрезок на " << n << " равных частей\n";
- h = (b - a) / (n*2);
- cout << "Шаг: " << h << "\n";
- res=f(a)+f(2*b);
- sum=0;
- for(int i=1;i<=n;i++){
- X=a+h*(2*i-1);
- sum+=f(X);
- }
- res=res+4*sum;
- sum=0;
- for(int i=1;i<n;i++){
- X=a+h*2*i;
- sum+=f(X);
- }
- res=res+2*sum;
- res=h/3*res;
- cout << "Значение интеграла:" << res;
- }
Advertisement
Add Comment
Please, Sign In to add comment