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

  弦截法公式: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;
}
posted on 2007-04-20 22:51 哈哈 阅读(3052) 评论(0)  编辑 收藏 引用

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