上交一维搜索法.docx
《上交一维搜索法.docx》由会员分享,可在线阅读,更多相关《上交一维搜索法.docx(11页珍藏版)》请在冰豆网上搜索。
上交一维搜索法
一、一维黄金分割法
F(X)=3*x*x*x-8*x+9,初始点:
0,初始步长:
0.1,终止迭代精度e:
0.01,求极小值点和极小值
程序:
#include
#include
#definef(x)3*x*x*x-8*x+9
main()
{
doublef1,f2,f3,t,x1,x2,x3,h,a,b,Y1,Y2,A,A1,A2,e=0.01;
printf("请输入x1,h:
");
scanf("%lf,%lf",&x1,&h);
f1=f(x1);
x2=x1+h;
f2=f(x2);
if(f2>=f1)
{
h=-h;
t=x1;x1=x2;x2=t;
t=f1;f1=f2;f2=t;
x3=x2+h;
f3=f(x3);
}
else
{
h=2*h;
x3=x2+h;
f3=f(x3);
}
while(f2>f3)
{
x1=x2;
x2=x3;
f2=f(x3);
x3=x2+h;
f3=f(x3);
}
a=x1x1:
x3;
b=x1>x3?
x1:
x3;
printf("[%f,%f]\n",a,b);
A1=b-0.618*(b-a);Y1=f(A1);
A2=a+0.618*(b-a);Y2=f(A2);
do{
if(Y1>=Y2)
{
a=A1;
A1=A2;
Y1=Y2;
A2=a+0.618*(b-a);
Y2=f(A2);
}
else
{
b=A2;
A2=A1;
Y2=Y1;
A1=a+0.382*(b-a);
Y1=f(A1);
}
}
while((a-b)>=e||(a-b)<=-e);
A=(a+b)*0.5;
printf("A=%lf\n",A);
printf("f(A)=%lf\n",f(A));
printf("a=%f,b=%f",a,b);
}
运行结果:
二、多维进退法和黄金分割法
求目标函数f(X)=60-10X1-4X2+X1*X1+X2*X2-X1*X2的极小值和极小值点,初始步长为h=0.1,终止迭代精度为e=0.05,初始点为[0,0]T,,方向为S=[0.8,0.6]T。
程序:
#include
#include
#defineN2
floatf(floata[N]);
voidhj();
voidjt();
floata0[N],d[N],a[N],b[N],a1[N],a3[N],h0,e;
floatmain()
{
inti;
printf("请输入初始点a0[N]\n");
for(i=0;i{
scanf("%f",&a0[i]);
}
printf("请输入搜索方向d[n]\n");
for(i=0;i{
scanf("%f",&d[i]);
}
printf("请输入步长h0和精度e\n");
scanf("%f,%f",&h0,&e);
jt();
hj();
}
floatf(floata[N])
{
floaty;
y=60-10*a[0]-4*a[1]+a[0]*a[0]+a[1]*a[1]-a[0]*a[1];
returny;
}
voidhj()
{
inti;
floata2[N],f1,f2,d0,f0;
for(i=0;i{
a1[i]=b[i]-0.618*(b[i]-a[i]);
}
for(i=0;i{
a2[i]=a[i]+0.618*(b[i]-a[i]);
}
f1=f(a1);
f2=f(a2);
do
{
if(f1>=f2)
{
for(i=0;i{
a[i]=a1[i];
a1[i]=a2[i];
a2[i]=a[i]+0.618*(b[i]-a[i]);
}
f2=f(a2);
f1=f(a1);
}
else
{
for(i=0;i{
b[i]=a2[i];
a2[i]=a1[i];
a1[i]=b[i]-0.618*(b[i]-a[i]);
}
f1=f(a1);
f2=f(a2);
}
d0=float(sqrt((b[0]-a[0])*(b[0]-a[0])+(b[1]-a[1])*(b[1]-a[1])));
}while((d0>=e));
for(i=0;i{
a0[i]=(a[i]+b[i])/2;
}
f0=f(a0);
printf("极小值点a0[]和极小值f0分别是:
\n");
for(i=0;i{
printf("a0[i]=%f\n",a0[i]);
}
printf("f0=%f\n",f0);
}
voidjt()
{
inti;
floata2[N],t1[N],f1,f2,f3,h;
for(i=0;i{
a1[i]=a0[i];
}
h=h0;
for(i=0;i{
a2[i]=a1[i]+d[i]*h;
}
f1=f(a1);
f2=f(a2);
if(f2>=f1)
{
h=-h;
for(i=0;i{
t1[i]=a1[i];
a1[i]=a2[i];
a2[i]=t1[i];
}
f1=f(a1);
f2=f(a2);
}
else
h=2*h;
for(i=0;i{
a3[i]=a2[i]+d[i]*h;
}
f3=f(a3);
while(f2>=f3)
{
for(i=0;i{
a1[i]=a2[i];
}
f1=f(a1);
for(i=0;i{
a2[i]=a3[i];
}
f2=f(a2);
for(i=0;i{
a3[i]=a2[i]+d[i]*h;
}
f3=f(a3);
}
if(h<0)
{
for(i=0;i{
b[i]=a1[i];
a[i]=a3[i];
}
}
else
{
for(i=0;i{
b[i]=a3[i];
a[i]=a1[i];
}
}
for(i=0;iprintf("\na[i]=%f\nb[i]=%f\n",a[i],b[i]);
}
运行结果:
优化设计作业
学院:
机仪学院
班级:
研1404班
姓名:
杨政威
学号:
2140220097