我将在“ACM--SOJ总结”中写关于二分法逼近求方程的解(尤其是不能显化的).这篇是pengkuny C++ blog中的一篇,我觉得很有必要摘录一下,供大家参详。
/**
  牛顿迭代法求方程的一个实根

  牛顿公式:x(k+1) = x(k) - f(x(k)) / f '(x(k))

  迭代函数:Ф(x) = x - f(x) / f'(x)

  属性:方程求根迭代法
 
  此时的迭代函数必须保证X(k)有极限,即迭代收敛。

**/
代码如下:

#include < iostream >
#include
< cmath >

using   namespace  std;

#define  f(x) (x*x*(x-1.0)-1.0)   // 举例函数x^3-x^2-1
#define  g(x) (3.0*x*x-2.0*x)   // 导函数3x^2-2x
#define  epsilon 0.0000001   // 精度
#define  MAXREAPT 100

bool  RootNewton( double   & x)
{
    
double  xk1,xk0;

    xk0 
=  x;
    
for  ( int  k = 0 ; k < MAXREAPT; k ++ )
    
{
        
if  (g(xk0)  ==   0.0 ) // 牛顿迭代法缺陷在于:收敛是否与初值x0密切相关
         { // 如果g(xk0)数值特别小时,有可能发生从一个根跳到另一个根附近的情况
            cout << " 迭代过程中导数为0. " << endl;
            
return   false ;
        }


        xk1 
=  xk0  -  f(xk0) / g(xk0); // key step

        
if  (fabs(xk1 - xk0)  <  epsilon  &&  fabs(f(xk1))  <  epsilon)
        
{ // 注意迭代结束条件是: |f(xk1)| < ε和|xk1-xk0| < ε同时成立,防止根跳跃
            x  =  xk1;
            
return   true ;
        }

        
else
        
{
            xk0 
=  xk1;
        }

    }


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


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

    
if (RootNewton(x))
    
{
        cout
<< " 该值附近的根为: " << x << endl;
    }

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


    system(
" pause " );
    
return   0 ;
}