求f(x)的最小值,f(x)等于所有s(x)中的最大值。。。由于条件判断我用的两逼近值之差mv-mmv,故循环应使用do-while,刚开始用的while,wa了好多次。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<float.h>
#define esp 1e-9
//三分法求函数极值
int n,a[10010],b[10010],c[10010];
double Cal(double x)
{
double s,max=-DBL_MAX;
int i;
for(i=0;i<n;i++){
s=a[i]*x*x+b[i]*x+c[i];
if(s>max) max=s;
}
return max;
}
double solve()
{
double left,right,mid,midmid,min;
double mv,mmv;
left=0.0; right=1000.0;
do{
mid=(left+right)/2;
midmid=(mid+right)/2;
mv=Cal(mid);
mmv=Cal(midmid);
if(mv<mmv) right=midmid; //求解最小值
else left=mid;
}while(fabs(mv-mmv)>esp); //此处用do-while
// printf("%.4lf %.4lf\n",mv,mmv);
return mv;
}
int main()
{
int t,i,j,k;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d %d",&a[i],&b[i],&c[i]);
printf("%.4lf\n",solve());
}
// system("pause");
return 0;
}