/**
弦截法求方程的一個(gè)實(shí)根
弦截法公式:x(k+1) = x(k) - ( x(k) - x(k-1) ) * f( x(k) ) / f( x(k) - f(x(k-1) )
屬性:方程求根迭代法
計(jì)算x(k+1)時(shí)需要利用前兩步信息x(k),x(k-1).免去了Newton法中需要求解一階導(dǎo)函數(shù)的繁瑣.
但收斂速度比牛頓法要慢
《數(shù)值計(jì)算方法與算法》-2 Editon -科學(xué)出版社 P94
代碼維護(hù):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) //舉例函數(shù)x^3-7.7x^2+19.2x-15.3
#define epsilon 0.0000001 //精度
#define MAXREAPT 100

bool RootChord(double &x0, double x1)
//根在區(qū)間[x0,x1]附近(不一定在區(qū)間里面),同時(shí)x0兼作求根結(jié)果返回,x0,x1誰大誰小沒有關(guān)系


{
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<<"迭代次數(shù)超過預(yù)期."<<endl;
return false;
}

int main()


{
double x0, x1;
cout<<"牛頓迭代法求方程根,請(qǐng)輸入初始迭代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
哈哈 閱讀(3081)
評(píng)論(0) 編輯 收藏 引用