Нужно объяснить, как мы ищем нули математической функции, используя рекурсивный алгоритм двоичного поиска - PullRequest
0 голосов
/ 22 апреля 2019

Следующая функция возвращает ноль в интервале (a, b) функции: f (x) = 5 * sin (x) * log (x) с точностью eps. Я не понимаю другую часть, где у нас есть условие, если (f (a) * f (x) <0. Я понимаю, что если у нас есть интервал (a, b) и f (a) * f (b) <0, это означает, что в этом интервале находится ноль математической функции, но я не понимаю, почему с помощью бинарного поиска мы сократили правая сторона для этого условия. </p>

float zero(float a, float b, float eps){

    float x = a + (b-a)/2;

    float val = 5*sin(x)*log(x);
    if(fabs(val) < eps){
        return x;
    }else{

        float left = 5*sin(a)*log(a);
        if(left*val < 0)
            return zero(a, x, eps);
        else
            return zero(x, b, eps);

    }
}

для ввода: 0.9 2 0.01 выход: 0.998828

1 Ответ

2 голосов
/ 22 апреля 2019

Вы используете метод деления пополам , чтобы найти нули (также называемые корневыми). Использование этого метода похоже на применение бинарного поиска снова и снова, пока значение не станет меньше epsilon. В зависимости от знака ответа мы либо продолжаем с левой или правой стороны раздела и уточняем этот процесс, пока значение не станет достаточно маленьким. Здесь - подробный пример того, как это математически работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...