折半法求方程的根

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

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;
}

 

转载于:https://www.cnblogs.com/wuOverflow/p/4274530.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值