优化设计鲍威尔法程序c语言.docx
- 文档编号:27422830
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:8
- 大小:15.15KB
优化设计鲍威尔法程序c语言.docx
《优化设计鲍威尔法程序c语言.docx》由会员分享,可在线阅读,更多相关《优化设计鲍威尔法程序c语言.docx(8页珍藏版)》请在冰豆网上搜索。
优化设计鲍威尔法程序c语言
优化设计-鲍威尔法程序(c语言)
#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[]);
floatf(floatx[])
{
floatresult;
result=60-10*x[0]-4*x[1]+x[0]*x[0]+x[1]*x[1]-x[0]*x[1];
returnresult;
}
/*多维进退法子程序*/
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 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); }/*已完成*/ for(i=0;i { if(x1[i] { a[i]=x1[i]; b[i]=x3[i]; } else { a[i]=x3[i]; b[i]=x1[i]; } } } /*多维黄金分割法子程序*/ 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 a[i]=x1[i]; for(i=0;i x1[i]=x2[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]); } /*鲍威尔法子程序*/ 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 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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 优化 设计 鲍威尔 程序 语言