Метод деления пополам, оценка точности по оси ординат

Нужно найти корень уравнения по методу деления пополам с точностью до 1e-6 и найти погрешность метода по оси ординат

#include <stdio.h>
#include <math.h>
int main(void){
    double eps=1e-6;
    double l = 0, r = 1;
    double m;
    double iterations = 0;

    while ((r - l) > eps){
        double m = (l + r)/2;
        double func_left = atan(l) - 0.75;
        double func_middle = atan(m) - 0.75;
        if ((func_left * func_middle) < 0 ){
            r = m;
        }
        else{
            l = m;
        }
        iterations++;
    } 

    iterations--;
    m = (l + r)/2;
    double L = fabs(r - l);
    double x_left = m - (L/pow(2, iterations)), x_right = m + (L/pow(2, iterations));
    double y_left = atan(x_left) - 0.75, y_right = (atan(x_right) - 0.75);
    double ef = fabs(y_left - y_right);

    printf("%.6lf\n", m);
    printf("%.8lf\n", ef);
    return0;
}

В указаниях к работе сказано, что вычисляется погрешность по оси ординат следующим образом, но мой код выдает неверный ответ, подскажите, пожалуйста, что я делаю не так введите сюда описание изображения


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

Автор решения: MBo

Вы ищете решение, обеспечивая как раз нужную точность по оси абсцисс, т.к. сравниваете (r - l) > eps.

А для достижения eps по оси ординат нужно сравнивать eps c abs(func_left-func_middle) - такое будет условие остановки цикла.

И когда остановились, то погрешность по иксу m-l, что эквивалентно начальному интервалу L=(r0-l0), деленному на двойку в степени количества итераций.

→ Ссылка