单点弦截法是双电弦截法的特殊情况,迭代的情况可能在有根区间的两个端点之间变换。如果迭代的结果始终在一侧的端点,这个端点会收敛于精确根,而有根区间另一个端点固定不变,那么双点弦截法变为单点弦截法。
单点弦截法的公式仍为X=b-f(b)(b-a)/(fb-fa),迭代过程中不需要判断根是哪一侧的端点。(这里的x将会用b来表示)
若f(x)在[a,b]上连续,且存在二阶导数,且满足下列以下条件:
1.f(a)*f(b)<0 //保证有奇数个根
2.f’’(x)不变号且f’’(x)!=0 //保证f(x)的凹凸性不变,且最多有两个实数根
3.F’’(x)*f(a)>0,则a为不变动点,否则b为不变动点。
1.2同时满足则存在唯一根
那我们写时需要我们手动确定有根区间边界,并指定哪边是不变动点。假设相邻两次迭代结果足够接近时,满足精度要求。为了避免不收敛或收敛过慢时出现死循环,这里设置最大迭代次数,若迭代次数超过最大的迭代次数,则退出。
开始需要确定设置的值:
函数的有根区间边界点a(不变动点),b(另一侧边界点);x0(初始迭代值),精度要求epsilon,最大迭代次数maxi,有根区间边界点的函数值fa=f(a),fb=f(b)。
设置的函数:
Double f(double x);
循环内的内容:1.初始迭代值,以及第一次迭代值,第一次迭代值的函数值
2.两个if语句:满足精度跳出,fb==0跳出
3.随着迭代次数的增加,初始迭代值变为第i次迭代值,第一次迭代值变为第i+1次迭代值,fb 变为第i+1次迭代值的函数值。
判断跳出循环的条件:
是否满足精度(b-x0),迭代次数已超过范围,f(x)==0
代码:
/*单点弦截法*/
#include<iostream>
#include<math.h>
using namespace std;
double f(double x)
{
return (2*x*x*x*x*x+5*x*x-1);
}
int main()
{
double a,b,fa,fb,epsilon,x0;
int i,maxi;
cout<<"请输入x的精度要求:";
cin>>epsilon;
cout<<"epsilon="<<epsilon<<endl;;
cout<<"请输入f(x)=0的有根区间边界不变动点a:";
cin>>a;
fa=f(a);
cout<<"a="<<a<<endl;
cout<<"请输入f(x)=0的有根区间边界另一侧边界点b:";
cin>>b;
fb=f(b);
cout<<"b="<<b<<endl;
cout<<"请输入最大迭代次数:";
cin>>maxi;
cout<<"maxi="<<maxi<<endl;
for(i=0;i<maxi;i++)
{
x0=b;
b=b-fb*(a-b)/(fa-fb);
fb=f(b);
if(fb==0)break;
if(fabs(b-x0)<=epsilon)break;
}
if(i<maxi)
cout<<"f(x)=0的根为x=:"<<b<<endl;
else
cout<<"迭代次数以超过上限!"<<endl;
return 0;
}
运行结果如图: