弦截法求方程的一个实根

弦截法求方程的一个实根
/**
  弦截法求方程的一个实根

  弦截法公式:x(k+1) = x(k) - ( x(k) - x(k-1) ) * f( x(k) ) / f( x(k) - f(x(k-1) )

  属性:方程求根迭代法
 
  计算x(k+1)时需要利用前两步信息x(k),x(k-1).免去了Newton法中需要求解一阶导函数的繁琐.
但收敛速度比牛顿法要慢

《数值计算方法与算法》-2 Editon -科学出版社 P94
   
 代码维护:2007.04.20   pengkuny
**/

#include < iostream >
#include
< cmath >

using   namespace  std;

#define  f(x) (x*x*x-7.7*x*x+19.2*x-15.3)   // 举例函数x^3-7.7x^2+19.2x-15.3
#define  epsilon 0.0000001   // 精度
#define  MAXREAPT 100

bool  RootChord( double   & x0,  double  x1)
// 根在区间[x0,x1]附近(不一定在区间里面),同时x0兼作求根结果返回,x0,x1谁大谁小没有关系
{
    
double xk, xk1, xk2;

    xk 
= x0;
    xk1 
= x1;
    
for (int i=0; i<MAXREAPT; i++)
    
{

        xk2 
= xk1 - f(xk1)*(xk1-xk)/(f(xk1)-f(xk)) ;//key step

        
if (fabs(xk2-xk1) < epsilon)
        
{
            x0 
= xk1;//返回根
            return true;
        }

        
else
        
{
            xk 
= xk1;
            xk1 
= xk2;
        }

    }


    
//迭代失败
    cout<<"迭代次数超过预期."<<endl;
    
return false;
}


int  main()
{
    
double x0, x1;
    cout
<<"牛顿迭代法求方程根,请输入初始迭代x0,x1值:"<<endl;
    cin
>>x0>>x1;

    
if(RootChord(x0, x1))
    
{
        cout
<<"在该初始值附近的根为:"<<x0<<endl;
    }

    
else
    
{
        cout
<<"迭代失败!"<<endl;
    }


    system(
"pause");
    
return 0;
}

你可能感兴趣的:(弦截法求方程的一个实根)