机械优化设计鲍威尔法.docx
《机械优化设计鲍威尔法.docx》由会员分享,可在线阅读,更多相关《机械优化设计鲍威尔法.docx(20页珍藏版)》请在冰豆网上搜索。
机械优化设计鲍威尔法
机械优化设计-鲍威尔法
#include
#include
#definem10/*数组长度m>=维数n*/floatf(floatx[]);voidmjtf(intn,floatx0[],floath,floats[],floata[],floatb[]);voidmhjfgf(intn,floata[],floatb[],floatflag,floatx[]);
voidmbwef(intn,floatx0[],floath,floatflag,floata[],floatb[],floatx[]);
/*目标函数(n维)*/
/*入口参数:
x:
n维数组,自变量*/
/*返回值:
函数值*/
floatf(floatx[])
{
floatresult;
result=60-10*x[0]-4*x[1]+x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
//result=10*(float)pow((x[0]+x[1]-5),2)+(float)pow((x[0]-x[1]),2);
returnresult;
}
/*多维进退法子程序*/
/*入口参数:
n:
优化模型维数
x0:
n维数组,初始点坐标
h:
初始搜索步长
s:
n维数组,搜索方向*/
/*出口参数:
a:
n维数组,搜索区间下限
b:
n维数组,搜索区间上限*/
voidmjtf(intn,floatx0[],floath,floats[],floata[],floatb[])
{
inti;
floatx1[m],x2[m],x3[m],f1,f2,f3;
for(i=0;i{
x1[i]=x0[i];
x2[i]=x0[i]+h*s[i];
}
f1=f(x1);
f2=f(x2);
if(f2>=f1)/*判断搜索方向*/
{/*搜索方向为反向,转身*/h=(-1)*h;
for(i=0;i
x3[i]=x1[i];
f3=f1;
for(i=0;i
x1[i]=x2[i];
f1=f2;
for(i=0;i
x2[i]=x3[i];
f2=f3;
}/*搜索方向为正向*/
for(i=0;i
x3[i]=x2[i]+h*s[i];
f3=f(x3);
while(f3
{/*未完成,继续搜索*/h=2*h;for(i=0;i
f1=f2;
for(i=0;i
x2[i]=x3[i];
f2=f3;
for(i=0;i
x3[i]=x2[i]+h*s[i];
f3=f(x3);
}/*已完成*/
for(i=0;i
{
if(h>0)
//if(x1[i]
{
a[i]=x1[i];
b[i]=x3[i];
}
else
{
a[i]=x3[i];
b[i]=x1[i];
}
}
}
/*多维黄金分割法子程序*/
/*入口参数:
n:
优化模型维数
a:
n
维数组,搜索区间下限
b:
n
维数组,搜索区间上限
flag:
迭代精度
*//*
出口参数
:
x:
n维数组,极小点坐标*/
voidmhjfgf(intn,floata[],floatb[],floatflag,floatx[])
{
inti;
floatx1[m],x2[m],f1,f2,sum;
for(i=0;i
x1[i]=b[i]-(float)0.618*(b[i]-a[i]);
f1=f(x1);
for(i=0;i
x2[i]=a[i]+(float)0.618*(b[i]-a[i]);
f2=f(x2);
do
{
if(f1<=f2)/*判断消去区间*/
{/*消去右*/
for(i=0;i
b[i]=x2[i];
for(i=0;i
x2[i]=x1[i];
f2=f1;
for(i=0;i
x1[i]=b[i]-(float)0.618*(b[i]-a[i]);
f1=f(x1);
}
else
{/*消去左*/for(i=0;i
f1=f2;
for(i=0;i
x2[i]=a[i]+(float)0.618*(b[i]-a[i]);
f2=f(x2);
}
sum=0;
for(i=0;i
sum+=(b[i]-a[i])*(b[i]-a[i]);
}while(sqrt(sum)>flag*0.1);/*判断是否未达到精度要求,若未达到则返回
继续缩小区间*/
for(i=0;i
x[i]=(float)0.5*(b[i]+a[i]);/*已达到,输出极小点*/}
/*鲍威尔法子程序*/
/*入口参数:
n:
优化模型维数
x0:
n维数组,初始点坐标
h:
初始搜索步长
flag:
迭代精度
a:
n维数组,搜索区间下限
b:
n维数组,搜索区间上限*/
/*出口参数:
x:
n维数组,极小点坐标*/
voidmbwef(intn,floatx0[],floath,floatflag,floata[],floatb[],floatx[])
{
inti,j,k,r;
floatx1[m],x2[m],f0,f1,f2,fn[m],s[m][m],sum;
for(i=0;i
方向矩阵初始化
*/
for(k=0;k
if(i==k)
s[i][k]=1;
else
s[i][k]=0;
k=1;
while
(1)
{
for(i=0;i
x1[i]=x0[i];
for(i=0;i
依次按每个方向搜索
*/
{
mjtf(n,x1,h,s[i],a,b);/*
调用多维进退法子程序
*/
mhjfgf(n,a,b,flag,x1);/*
调用多维黄金分割法子程序
*/
fn[i]=f(x0)-f(x1);/*
计算函数下降值
*/
}
for(i=0;i
计算映射点
*/
x2[i]=2*x1[i]-x0[i];
for(i=1;i
找出函数下降值中的最大值存入
fn[0]*/
if(fn[0]
{
fn[0]=fn[i];
r=i;
}
else
r=0;
f0=f(x0);/*计算始点、终点和映射点的函数值*/
f1=f(x1);
f2=f(x2);
if(f2>=f0||(f0-2*f1+f2)*(f0-f1-fn[0])*(f0-f1-fn[0])>=0.5*fn[0]*(f0-f2)*(f0-f2))
{/*判断是否需要换方向*//*不需要换*/sum=0;/*计算一轮中终点与始点的距离*/for(i=0;isum+=(x1[i]-x0[i])*(x1[i]-x0[i]);
if(f1<=f2)/*判断将终点还是将映射点赋给下一轮始点*/
for(i=1;i
x0[i]=x1[i];
else
for(i=1;i
x0[i]=x2[i];
}
else
{/*需要换*/
for(i=r;i
for(j=0;j
s[i][j]=s[i+1][j];
for(i=0;i
s[n][i]=x1[i]-x0[i];
mjtf(n,x1,h,s[n],a,b);/*按新方向搜索一次*/
mhjfgf(n,a,b,flag,x1);
sum=0;/*计算一轮中终点与始点的距离*/
for(i=0;i
sum+=(x1[i]-x0[i])*(x1[i]-x0[i]);
for(i=0;i
将终点赋给下一轮始点
*/
x0[i]=x1[i];
}
if(sqrt(sum)<=flag)/*
判断是否满足精度要求
*/
break;
else
k+=1;
}
for(i=0;i
输出极小点坐标
*/
x[i]=x1[i];
}
/*鲍威尔法主程序voidmain(){
*/
inti,n;
floath,flag,x0[m],a[m],b[m],x[m];
printf("\n<鲍威尔法>\n");
printf("请输入维数:
\n");
scanf("%d",&n);
printf("请输入初始点:
");
for(i=0;i
{
printf("\nx0[%d]=",i);
scanf("%f",&x0[i]);
}
printf("\n请输入初始步长:
\n");
scanf("%f",&h);
printf("\n请输入精度:
\n");
scanf("%f",&flag);
mbwef(n,x0,h,flag,a,b,x);
printf("\n极小点坐标为:
\n");
for(i=0;i
printf("x[%d]=%f\n",i,x[i]);
printf("\n极小值为:
\n%f\n",f(x));}