1. 程式人生 > >二分法求函式零點

二分法求函式零點

/*
二分法求函式的零點
 */

#include <bits/stdc++.h>
using namespace std;

double f(double x)
{
    return pow(x, 2) + 3*x + 2;  // f = x^2+3x+2
}

// 指定根區間範圍為[a, b],根誤差為eps
double root(double a, double b, double eps)
{
    double mid = (a+b)/2.0;

    //註釋掉的部分是以值誤差為小於eps情況下的求解
//    while( 1 )
//    {
//        if(abs(f(mid)) < eps)
//            break;
//        else if(f(a)*f(mid) < 0)
//            b = mid;
//        else a = mid;
//        mid = (a+b)/2.0;
//    }

    while(b-a>eps)
    {
        if(f(mid)==0)
            break;
        else if(f(a)*f(mid) < 0)
            b = mid;
        else a = mid;
        mid = (a+b)/2.0;
    }
    return mid;
}

int main()
{
    double res = root(-1.5, 0, 0.001);
    cout << res << endl;
    return 0;
}