折半法求方程的根
至今仍存在问题, 就是无法解高于一次的方程, 希望看到此文的朋友可以给出您的见解。
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; }