#include<stdio.h>
#include<math.h>
#define f(x) x*x+2*x+1// 定义函数
int main()
{
double a0,a1,a2,a3,f1,f2,f3,h;
printf( "a0= ",a0);// 单谷区间起始点
scanf( "%lf" ,&a0);
printf("h= " ,h);// 起始的步长
scanf( "%lf" ,&h);
a1=a0;
a2=a1+h;
f1=f(a0);
f2=f(a2);
if(f1>f2)
// 判断函数值的大小 ,确定下降方向
{
a3=a2+h;
f3=f(a3);
}
else
{
h=-h;
a3=a1;
f3=f1;
a1=a2;
f1=f2;
a2=a3;
f2=f3;
a3=a2+h;
f3=f(a3);
}
while(f3<=f2)
// 当不满足上述比较时 ,说明下降方向反向 ,继续进行
{
h=2*h;
a1=a2;
f1=f2;
a2=a3;
f2=f3;
a3=a2+h;
f3=f(a3);
}
float e;
float a,b;
float x1,x2,x,g,g1,g2,N;
printf("e=");
scanf("%f",&e);
//令a=a0,b=b0
a=a1,b=a3;
//第一次缩小区间
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
//目标函数
g1=(pow(x1,2)+2*x1+1);
g2=(pow(x2,2)+2*x2+1);
//printf("校核f1=%f,f2=%f\n",f1,f2);
//判断
do{
if(g1<g2){
N=0;
b=x2;
x2=x1,g2=g1;
}else{
N=1;
a=x1;
x1=x2,g1=g2;}
N=fabs(a-b);
if(N<=e){
x=(a+b)/2;
printf("x*=%.3f ",x);
g=(pow(x,2)+2*x+1);
break;
}
else{
if(N){
x1=a+0.382*(b-a);
g1=(pow(x1,2)+2*x1+1);
}else{
x2=a+0.618*(b-a);
g2=(3*pow(x2,2)+2*x2+1);
}
}
} while(1) ;
printf("g*= %lf,a= %lf,b= %lf",g,a,b);
return 0;
运行结果: