这是第一次接触模拟退火,感觉挺棒的。
#include<stdio.h>
#include<math.h>
#define INF 1e30
double a,b,c,d,e,f;
double getz(double x,double y){
double A=c;
double B=d*y+e*x;
double C=a*x*x+b*y*y+f*x*y-1;
double delta=B*B-4.0*A*C;
if(delta<0)return INF;
else{
double z1,z2;
z1=(-B+sqrt(delta))/A/2.0;
z2=(-B-sqrt(delta))/A/2.0;
if(fabs(z1)<fabs(z2))
return z1;
else return z2;
}
}
double dx[8]={-1,-1,-1,0,0,1,1,1};
double dy[8]={-1,0,1,-1,1,-1,0,1};
double dis(double x,double y,double z){
return sqrt(x*x+y*y+z*z);
}
int main(){
while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF){
double step=1,r=0.99;
double cx=1,cy=0,nx,ny,cz,nz;
cz=getz(cx,cy);
double ans=dis(cx,cy,cz),temp;
while(step>1e-10){
for(int i=0;i<8;i++){
nx=cx+dx[i]*step;
ny=cy+dy[i]*step;
nz=getz(nx,ny);
temp=dis(nx,ny,nz);
if(temp<ans){
cx=nx;
cy=ny;
ans=temp;
}
}
step*=r;
}
printf("%.7lf\n",ans);
}
return 0;
}