Интегрирование методом средних прямоугольников и трапеций
Мне необходимо написать функцию на С++, которая будет получать на вход адрес на функцию (одну из y=x, y=sin(22x), y=x^4, y=arctan(x)), концы отрезка интегрирования (a ∊ [0,1], b ∊ [2,3]), дельту - разницу между двумя последовательными итерациями, а также n, которое, изменяясь, будет показывать количество столбцов разбиения. Суть метода мне ясна, функция работает для y=x, y=x^4, y=arctan(x), но в функции y=sin(22x) начинаются проблемы при |b-a|/2=1.
Проблема состоит в том, что значения первых двух итераций при |b-a|/2=1 будут меньше, чем заданная дельта (т.е при eps=10e-6 функция работать будет). Вопрос заключается в том, как избежать эту ситуацию в функции y=sin(22*x).
double IntRect(TPF f, double a, double b, double eps, int& n) {
double dx = (b - a) / 2;
double s1=5;
double s2=0;
s2 = f(a) * dx + f(a + dx) * dx;
while (abs(s2-s1) > eps){
s1 = s2;
dx = dx/2;
n = n*2;
s2 = 0;
for (int i = 0; i < n; i++) {
s2 = s2 + f(a + dx * i);
}
s2 *= dx;
}
return s2;
}

