这是一道二分查找的题
每次选定义域中间的点,求导可判断出其单调性,F((x+y)/2)'>0说明其根落在x到(x+y)/2区间内反之则在其(x+y)/2到y区间,以此类推每次缩小一半直到定义域精度小于1e-6.
即可求出近似根的坐标,代入原方程即可求解。
#include<stdio.h>
#include<math.h>
double hs(double x,double y)
{
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*x*x-y*x;//函数
}
double ds(double x,double y)
{
return 42*pow(x,6)+48*pow(x,5)+21*pow(x,2)+10*x-y;//导数
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double x,y,x1,y1;//x和y是函数的定义域,x1y1是中间函数的坐标
scanf("%lf",&y1);
x=0.0;
y=100.0;
while(y-x>1e-6)
{
x1=(x+y)/2;
if(ds(x1,y1)>0)
y=x1;
else
x=x1;
}
printf("%.4lf\n",hs(x1,y1));
}
return 0;
}