/**
弦截法求方程的一个实根
弦截法公式: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
哈哈 阅读(3051)
评论(0) 编辑 收藏 引用