#include
#include
#include
#define e 0.001 /*收敛精度*/
#define tt 0.01 /*一维搜索步长*/
float function(float x) /*定义已知函数*/
{
float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;
return(y);
}
void finding(float a[4]) /*进退法求区间[a,b]*/
{
float h=tt; /*初始步长*/
float x0,x1,f1,x2,f2,x3,f3;
int i;
printf ("输入一个初始值:");
scanf ("%f",&x0);
x1=x0,x2=x1+h;
f1=function(x1),f2=function(x2);
if(f1==f2)
a[0]=x1,a[3]=x2;
else
{
if(f1>f2) /*作前进计算*/
{
x3=x2+h;
f3=function(x3);
if (f3 for(i=0;;i++)
{
h=2*h;
x1=x2,f1=f2;
x2=x3,f2=f3;
x3=x2+h;
f3=function(x3);
if (f2 }
}
else
{
x2=x1-h; /*作后退计算*/
f2=function(x2);
x3=x2-h;
f3=function(x3);
if (f3 for(i=0;;i++)
{
h=2*h;
x1=x2,f1=f2;
x2=x3,f2=f3;
x3=x2-h;
f3=function(x3);
if (f2 }
}
}
if(x1 a[0]=x1,a[3]=x3; /*将所求区间值赋给a,b用以输出*/
else
a[0]=x3,a[3]=x1;
printf("所求搜索区间[a,b]=[%.2f,%.2f]\n",a[0],a[3]);
return;
}
float gold(float *ff) /*黄金分割法求解*/
{
float a1[3],f1[3],a[4],f[4];
float aa;
int i;
finding(a);
a[1]=a[0]+0.382*(a[3]-a[0]),a[2]=a[0]+0.618*(a[3]-a[0]);
f[0]=function(a[0]),f[1]=function(a[1]),f[2]=function(a[2]),f[3]=function(a[3]);
for(i=1;;i++) /*计算迭代次数*/
{
if(f[1]>=f[2])
{
a[0]=a[1];f[0]=f[1];
a[1]=a[2];f[1]=f[2];
a[2]=a[0]+0.618*(a[3]-a[0]);f[2]=function(a[2]);
}
else{
a[3]=a[2];f[3]=f[2];
a[2]=a[1];f[2]=f[1];
a[1]=a[0]+0.382*(a[3]-a[0]);f[1]=function(a[1]);
}
if(a[3]-a[0] {
aa=(a[1]+a[2])/2;
*ff=function(aa);
printf("\n迭代次数n=%d\n",i);
break;
}
}
return(aa);
}
void main()
{
printf("**黄金分割法求函数极小值点**\n");
float xx,ff;
xx=gold(&ff);
printf("优化设计的结果是:\n");
printf("x*=%f\nf*=%f\n",xx,ff);
printf("**梁清航**\n");
getch();
}