#include http://www.matmetod.ru/method_trapezium_program #include #include #include using namespace std; //функция в которой задаётся математическая функция относительно которой вычисляется интеграл float func(float x, float A, float B, float C ) { return (A*pow(x,2))+(B*x)+C; // return pow(x,2); } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); //создаём переменные string quit = ""; do { float eps = 0; //переменная для точности float a = 0; //переменная для нижнего предела интеграла float b = 0; //переменная для верхнего предела интеграла float n = 2; //задаём начальное количество интервалов float h = 0; //задаём переменную для хранения величины интервала float h_middle = 0; //задаём переменную для величины середины интервала float eps_solve = 0; //задаём переменную для хранения результата погрешности float eps_left = 0; //задаём переменную для хранения результата вычисления левой части интеграла float eps_right = 0; //задаём переменную для хранения результата вычисления правой части интеграла bool degree = false; //переменная которая определяет возводить количество интервалов в степень 2, с каждой итерацией или увеличивать на 2 // при возведении в степень, вычисление может надолго затянуться )) float A = 0; float B = 0; float C = 0; //считываем значение нижнего предела интегрирования cout << "Vvedite nizniy predel integrirovaniya:"; cin >> a; cout << endl; //считываем значение верхнего предела интегрирования, при условии что он будет больше нижнего while(b <= a) { cout << "Vvedite verhniy predel integrirovaniya( > " << a << "):"; cin >> b; cout << endl; } //считываем погрешность cout << "Vvedite tochnost'':"; cin >> eps; cout << endl; cout << "A="; cin >> A; cout << endl; cout << "B="; cin >> B; cout << endl; cout << "C="; cin >> C; cout << endl; //вычисляем интеграл //задаём цикл в котором будет вычисляться интеграл int num_iteration = 0; bool first = true; do { //обнуляем значение частей интегралов на каждой итерации eps_left = 0; eps_right = 0; //для расчёта левой части h = (b - a)/n; //вычисляем величину интервала, успользуется как шаг h_middle = h/2; //вычисляем величину серидины интервала for(float i = 0; i < n; i++) { eps_left += fabs(func(h_middle,A,B,C))*h; h_middle += h; } //для расчёта правой части if(degree) { if(first) { n = n /2; } else { n = sqrt(n); } } else { if(first) { n = 1; } else { n = n / 2; } } h = (b - a)/n; //вычисляем величину интервала, используем как шаг h_middle = h/2; //вычисляем величину серидины интервала for(float i = 0; i < n; i++) { eps_right += fabs(func(h_middle,A,B,C))*h; h_middle += h; } //вычисляем погрешность, которую потом сравниваем с той что ввели eps_solve = eps_left - eps_right; //увеличиваем количество интервалов в слудующей итерации //если погрешность вычислений больше заданной if(degree) { if(first) { n = n * 2; } else { n = pow(n,2); } n = pow(n,2); } else { n = n*4; } first = false; num_iteration++; } while(eps < eps_solve || eps_solve < 0); cout << "solve!!!!" << endl; cout << "integral raven:" << eps_left << endl; cout << "pogreshnost':"; cout << eps_solve << endl; cout << "num of iteration:" << num_iteration << endl; cout << "povtorit'?[y/n]:" ; cin >> quit; } while(quit != "n"); return app.exec(); }