折半法求方程的根

至今仍存在问题, 就是无法解高于一次的方程, 希望看到此文的朋友可以给出您的见解。

enum Condition
{
    close_enough
    , positive
    , negative
};

Condition CloseEnough (double test_number
                  , function<double(const double&)> f)
{
    auto result = f (test_number);
    if (result < 0) {
        return negative;
    }
    else if (result < 0.0001) {
        return close_enough;
    }
    else {
        return positive;
    }
}

double SearchAnswer ( double neg_point
                    , double pos_point
                    , function<double(const double&)> f)
{
    auto mid_point = (neg_point + pos_point) / 2;
    auto condition = CloseEnough (mid_point, f);
    if (condition == close_enough) {
        return mid_point;
    }
    else if (condition == positive) {
        return SearchAnswer (neg_point, mid_point, f);
    }
    else {
        return SearchAnswer (mid_point, pos_point, f);
    }
}

int main ()
{
    cout << SearchAnswer (-8.2, 2.3, [] (const double &x){return (4 * x - 1);});
    cout << endl;
    return 0;
}

 问题解决, 是因为会出现两个点同号的情况导致的程序失败, 因此只需要加一个判断, 若同号, 则抛出异常。

enum Condition
{
    close_enough
    , positive
    , negative
};

Condition CloseEnough (double test_number
                  , function<double(const double&)> f)
{
    auto result = f (test_number);
    if (result < 0) {
        return negative;
    }
    else if (result < 0.0001) {
        return close_enough;
    }
    else {
        return positive;
    }
}

double SearchAnswer ( const double &neg_point
                    , const double &pos_point
                    , function<double(const double&)> f)
{
    if (neg_point * pos_point > 0) {
        throw logic_error (
            "Points must on different sides!");
    }
    auto mid_point = (neg_point + pos_point) / 2;
    auto condition = CloseEnough (mid_point, f);
    if (condition == close_enough) {
        return mid_point;
    }
    else if (condition == positive) {
        return SearchAnswer (neg_point, mid_point, f);
    }
    else {
        return SearchAnswer (mid_point, pos_point, f);
    }
}

int main ()
{
    try {
        cout << SearchAnswer (-8.2, 2.3
                              , [] (const double &x)
        {return (x * x * x - 27); });
    }
    catch (exception err) {
        cout << err.what ();
    }
    cout << endl;
    return 0;
}

 

posted @ 2015-02-05 12:53  wu_overflow  阅读(304)  评论(0编辑  收藏  举报