/**
弦截法求方程的一個實根
弦截法公式: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
哈哈 閱讀(3064)
評論(0) 編輯 收藏 引用