机械优化设计鲍威尔法.docx
- 文档编号:5704470
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:20
- 大小:16.06KB
机械优化设计鲍威尔法.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;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));}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机械 优化 设计 鲍威尔