Posted on 2011-11-25 20:54
hoshelly 閱讀(2153)
評論(0) 編輯 收藏 引用 所屬分類:
C++
二分法思想:假定f(x)在區間(x,y)上連續
先找到a、b屬于區間(x,y),使f(a),f(b)異號,
說明在區間(a,b)內一定有零點,然后求f[(a+b)/2],
現在假設f(a)<0,f(b)>0,a<b
①如果f[(a+b)/2]=0,該點就是零點, 如果f[(a+b)/2]<0,則在區間((a+b)/2,b)內有零點,(a+b)/2=>a,從①開始繼續使用 中點函數值判斷。 如果f[(a+b)/2]>0,則在區間(a,(a+b)/2)內有零點,(a+b)/2<=b,從①開始繼續使用 中點函數值判斷。 這樣就可以不斷接近零點。 通過每次把f(x)的零點所在小區間收縮一半的方法,使區間的兩個端點逐步迫近函數的零點,以求得零點的近似值,這種方法叫做二分法。
頭文件定義
class CEquation
{
private:
double solution; //方程的近似解
double a, b; //近似解的區間
double (*p_fx)(double x); //p_fx是一個指向函數的指針,指向方程式求值函數
double (*p_solution)(double x, double y); //指向由近似解區間求近似解的函數的指針
double delta; //求解精度
public:
CEquation(double av, double bv, double (*p1)(double), double (*p2)(double,double), double dv);
double biSection(); //二分法求方程近似解
void printSolution() const;
};
類的實現及主函數實現:
CEquation::CEquation(double a_val, double b_val, double (*p1)(double), double (*p2)(double, double), double delta_val)


{
a = a_val;
b = b_val;
p_fx = p1;
p_solution = p2;
solution = p_solution(a, b);
delta = delta_val;
}

double fx(double x) //方程為: e^x+4^x3-6^x2+3x-2=0


{
return exp(x)+4.0*x*x*x-6.0*x*x+3.0*x-2.0;
}

double middle(double x, double y) //中值


{
return 0.5*(x+y);
}

double CEquation::biSection()


{
double h;

while (fabs(a-b) > delta)

{
h = p_solution(a, b);
if (p_fx(a)*p_fx(h) > 0)
a = h;
else
b = h;
}
solution = p_solution(a, b);
return solution;
}

void CEquation::printSolution() const


{
cout << "Solution is: " << solution << endl;
}

void main ()


{
CEquation a(0.0, 1.0, fx, middle, 1e-6);

a.biSection();
a.printSolution();
}
