解决求超越方程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 请按任意键继续. .
.