需要说明我们如何使用递归二进制搜索算法搜索数学函数的零

时间:2019-04-21 22:35:03

标签: c function recursion math

以下函数在函数的间隔(a,b)中返回零:f(x)= 5 * sin(x)* log(x),精度为eps。 我不明白我们有条件if(f(a)* f(x)<0的else部分。 我确实知道,如果我们有区间(a,b)并且f(a)* f(b)<0,则意味着该区间的数学函数为零,但是我不明白为什么使用二进制搜索会减少这种情况的右侧。

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 个答案:

答案 0 :(得分:2)

您正在使用bisection method查找零(也称为根)。使用此方法就像一次又一次地执行二进制搜索,直到该值小于epsilon。根据答案的符号,我们将继续本节的左侧或右侧,并优化此过程,直到该值足够小为止。 Here是这在数学上如何工作的详细示例。