董建兴 现代设计方法之优化设计 编程
黄金分割法 c语言程序
题目:用黄金分割法求f(x)=x2-7x+10的最优解。设置初始点为:x0=0,初始步长h=1,取迭代精度e=0.35
程序:
#include "stdio.h"
#include "math.h"
#include "conio.h"
#define e 0.35
#define tt 1
float function(float x)
{
float y;
y=pow(x,2)-7*x+10;
return(y);
}
void searching(float a[3],float f[3])
{float h=tt,a1,f1,ia,i;
a[0]=0;
f[0]=function(a[0]);
for(i=0;;i++)
{a[1]=a[0]+h;
f[1]=function(a[1]);
if(f[1]
if(fabs(f[1]-f[0])>=e)
{h=-h;a[0]=a[1];f[0]=f[1];}
else{ if(ia==1) return;
h=h/2;ia=1;}
}
for(i=0;;i++)
{a[2]=a[1]+h;
f[2]=function(a[2]);
if(f[2]>f[1]) break;
h=2*h;
a[0]=a[1];f[0]=f[1];
a[1]=a[2];f[1]=f[2];
}
if(a[0]>a[2])
{a1=a[0];f1=f[0];
a[0]=a[2];f[0]=f[2];
a[2]=a1;f[2]=f1;
}
return;
}
void main()
{ float function(float x);
float a1[3],f1[3],a[4],f[4];
float F1,F2,m,n,xx;
searching(a1,f1);
a[0]=a1[0];f[0]=f1[0];
a[3]=a1[2];f[3]=f1[2];
while(fabs(a[0]-a[3])>e)
{
m=a[3]-0.618*(a[3]-a[0]);
n=a[0]+0.618*(a[3]-a[0]);
F1=function(m);
F2=function(n);
if(F1
a[3]=n;
else a[0]=m;
xx=(a[0]+a[3])/2;
printf("F1=%16.12f F2=%16.12f a[0]=%16.12f a[3]=%16.12f\n xx=%16.12f\n",F1,F2,a[0],a
[3],xx);
}
}