机械优化设计鲍威尔法.docx

上传人:b****7 文档编号:11413622 上传时间:2023-02-28 格式:DOCX 页数:20 大小:16.06KB
下载 相关 举报
机械优化设计鲍威尔法.docx_第1页
第1页 / 共20页
机械优化设计鲍威尔法.docx_第2页
第2页 / 共20页
机械优化设计鲍威尔法.docx_第3页
第3页 / 共20页
机械优化设计鲍威尔法.docx_第4页
第4页 / 共20页
机械优化设计鲍威尔法.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

机械优化设计鲍威尔法.docx

《机械优化设计鲍威尔法.docx》由会员分享,可在线阅读,更多相关《机械优化设计鲍威尔法.docx(20页珍藏版)》请在冰豆网上搜索。

机械优化设计鲍威尔法.docx

机械优化设计鲍威尔法

 

机械优化设计-鲍威尔法

 

#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;i

sum+=(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));}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1