非线性方程求解——单点弦截法

  单点弦截法是双电弦截法的特殊情况,迭代的情况可能在有根区间的两个端点之间变换。如果迭代的结果始终在一侧的端点,这个端点会收敛于精确根,而有根区间另一个端点固定不变,那么双点弦截法变为单点弦截法。

单点弦截法的公式仍为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;	
 } 

运行结果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值