Интегрирование методом средних прямоугольников и трапеций

Мне необходимо написать функцию на С++, которая будет получать на вход адрес на функцию (одну из 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.

Ответ верный при а=0, b=3

Ответ неверный при а=0, b=2

Проблема состоит в том, что значения первых двух итераций при |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;
}

Ответы (0 шт):