【计算机算法】基于最小的枚举求精——解超越方程

解决求超越方程x的问题
以下是基于最小的枚举求精法,还有基于符号的枚举求精方法。
用基于最小的枚举求精法替代暴力破解方法,可以省去不少时间,而且暴力破解并不一定能够找出精确地小数点值。
解其他超越方程只需要修改fc中的返回值。

#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;
double fc(double x)
{
	return 2*pow(x,2)*pow(sin(x),7)+3*pow(x,0.5)*cos(x)-exp(x)/5;
}
int main()
{
	double length=0.1,a,b,temp=0,i,x1;
	cout<<"求方程在[a,b]之间的一个解,请输入a和b:";
	cin>>a>>b;
	/*检验这个方程是否存在一个解*/
	for(i=a;i<b;i=i+length)
	{
		if(fc(i)*fc(b)<0)
		{	temp=1;  cout<<"该方程存在解!"<<endl;   break;}
	} 
	 if(temp==0)
	 {	cout<<"该方程无解!"<<endl;   return 0;}
	 else if(temp==1)/*在判断出有解之后,从此步进行基于最小值的逐步求精*/
	 {
	 	length=0.1;
	 	double x,y;
	 	int k=1;
	 	double min=100.0;
	 	while(k<=8)/*小数点后八位,所以设置八次循环,八次逐步求精*/
	 	{
	 		for(x=a;x<=b;x+=length)/*以左右端点为界,不断扫描*/ 
	 		{
	 			y=fc(x);/*求出这个x时的函数值*/ 
	 			if(fabs(y)<min)/*比较函数值的绝对值和min的最小值,从而求出最小的绝对值*/ 
	 			{
	 				x1=x; min=fabs(y);/*!!不用break是因为要找出在哪的时候,值最小,要把区间内的数以length的长度扫描完!!*/ 
				 }
			 }
			 length=length/10;/*逐步求精,缩小长度*/ 
			 a=x1-length*5;/*改变范围,因为缩小了长度*/ 
			 b=x1+length*5;
			 k++;
		 }
	 }
	 printf("一个解为:%.8f\n",x1);
	 return 0;
}

运行结果如下:

求方程在[a,b]之间的一个解,请输入a和b:2 3
该方程存在解!
一个解为:2.05688159


Process exited after 1.012 seconds with return value 0 请按任意键继续. .

.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值