天之道

享受编程的乐趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

二分法求方程的近似解(C++实现)

Posted on 2011-11-25 20:54 hoshelly 阅读(2081) 评论(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)(doubledouble), 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.01.0, fx, middle, 1e-6);

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





只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理