当前位置:文档之家› 优化设计实验报告(...)(1)

优化设计实验报告(...)(1)

机械优化设计实验报告姓名:***学号:********** 班级:07机设一班一、黄金分割法1、 数学模型2()2f x x x =+,56x -≤≤2、 黄金分割法简介黄金分割法适用于单谷函数求极小值问题,且函数可以不连续。

黄金分割法是建立在区间消去法原理基础上的试探方法,即在搜索区间[],a b 内适当插入两点1α、2α,并计算其函数值。

1α、2α将区间分成三段。

应用函数的单谷性质,通过函数值大小的比较,删去其中一段,使搜索区间得以缩短。

然后再在保留下来的区间上作同样的处置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似解。

黄金分割法能使相邻两次都具有相同的缩短率0.618,故黄金分割法又称作0.618法。

3、黄金分割法程序清单#include<stdio.h>#include<math.h>/*目标函数*/float ff(float x){float y;y=x*x+2*x;return(y);}main(){float a,b,ab,Epsilon;float y1,y2,Alpha1,Alpha2;float Lambda=0.618;printf("please input the arear and Epsilon\n");scanf("%f,%f,%f",&a,&b,&Epsilon);Alpha1=b-Lambda*(b-a),Alpha2=a+Lambda*(b-a);printf("%f,%f\n",Alpha1,Alpha2);y1=ff(Alpha1);y2=ff(Alpha2);printf("y1=%f,y2=%f\n",y1,y2);do{if(y1>=y2){a=Alpha1;Alpha1=Alpha2;y1=y2;Alpha2=a+Lambda*(b-a);y2=Alpha2*Alpha2+2*Alpha2;}else{b=Alpha2;Alpha2=Alpha1;y2=y1;Alpha1=b-Lambda*(b-a);y1=Alpha1*Alpha1+2*Alpha1;}printf("a=%f,b=%f,y1=%f,y2=%f\n",a,b,y1,y2);}while(!(abs((b-a)/b)<Epsilon&&abs((y2-y1)/y2)<Epsilon));ab=0.5*(a+b);y1=ff(ab);printf("the result is :%f",y1);getch();}4、运行结果:一、 变尺度法1、 数学模型211222121248),(x x x x x x x F --+=2、 变尺度法简介基本思想:(1) 用简单矩阵代替二阶导数矩阵的逆矩阵12()k f X -⎡⎤∇⎣⎦(2) 用坐标变换简化目标函数具体如下:当用牛顿法寻求极小点时,其牛顿迭代公式为 11(0,1,2)k k k k k x x G g k α+-=-=其中 2()()k k k k g f x G f x ≡∇≡∇在迭代中建立变尺度矩阵()k k H H x ≡来替换1k G -,即构造一个矩阵序列{}k H 来逼近海赛逆矩阵序列{}1k G -。

每迭代一次,尺度就改变一次,这正是“变尺度”的含义。

这样,上式变为11(0,1,2)k k k k k x x G g k α+-=-=其中k α是从k x 出发,沿方向 k k k d H g =-作一维搜索而得到的最佳步长。

当k H I =(单位矩阵)时,它就变成最速下降法。

这就是变尺度法的基本思想。

变尺度法程序清单:/*计算 f(x1,x2)=x1^2+8*x2^2-4*x1-2*x1*x2 的无约束极值,初始点x0=[1,1]。

tt ---- 一维搜索初始步长ff ---- 差分法求梯度时的步长ac ---- 终止迭代收敛精度ad ---- 一维搜索收敛精度n ----- 设计变量的维数xk[n] -- 迭代初始点*/#include<stdio.h>#include<stdlib.h>#include<math.h>#include<conio.h>#define tt 0.01#define ff 1.0e-6#define ac 1.0e-6#define ad 1.0e-6#define n 8double ia;double fny(double *x){double x1=x[0],x2=x[1];double f;f=x1*x1+8*x2*x2-4*x1-2*x1*x2;return f;}double * iterate(double *x,double a,double *s){double *x1;int i;x1=(double *)malloc(n*sizeof(double));for(i=0;i<n;i++)x1[i]=x[i]+a*s[i];return x1;}double func(double *x,double a,double *s){double *x1;double f;x1=iterate(x,a,s);f=fny(x1);return f;}void finding(double a[3],double f[3],double *xk,double *s) {double t=tt;int i;double a1,f1;a[0]=0;f[0]=func(xk,a[0],s);for(i=0;;i++){a[1]=a[0]+t;f[1]=func(xk,a[1],s);if(f[1]<f[0]) break;if(fabs(f[1]-f[0])>=ad){t=-t;a[0]=a[1];f[0]=f[1];}else{if(ia==1) return;t=t/2;ia=1;}}for(i=0;;i++){a[2]=a[1]+t;if(f[2]>f[1]) break;t=2*t;a[0]=a[1];f[0]=f[1];a[1]=a[2];f[1]=f[2];}if(a[0]>a[2]){a1=a[0];f1=f[0];a[0]=a[2];f[0]=f[2];a[2]=a1;f[2]=f1;}return;}double lagrange(double *xk,double *ft,double *s){int i;double a[3],f[3];double b,c,d,aa;finding(a,f,xk,s);for(i=0;;i++){if(ia==1) { aa=a[1]; *ft=f[1]; break; }d=(pow(a[0],2)-pow(a[2],2))*(a[0]-a[1])-(pow(a[0],2)-pow(a[1],2))*(a[0]-a[2]);if(fabs(d)==0) break;c=((f[0]-f[2])*(a[0]-a[1])-(f[0]-f[1])*(a[0]-a[2]))/d;if(fabs(c)==0) break;b=((f[0]-f[1])-c*(pow(a[0],2)-pow(a[1],2)))/(a[0]-a[1]);aa=-b/(2*c);*ft=func(xk,aa,s);if(fabs(aa-a[1])<=ad) {if(*ft>f[1]) aa=a[1];break;}if(aa>a[1]){if(*ft>f[1]) {a[2]=aa;f[2]=*ft;}else if(*ft<f[1]) {a[0]=a[1];a[1]=aa;f[0]=f[1];f[1]=*ft;}else if(*ft==f[1]){f[2]=*ft;f[0]=f[1];a[1]=(a[0]+a[2])/2;f[1]=func(xk,a[1],s);}}else{if(*ft>f[1]) {a[0]=aa;f[0]=*ft;}else if(*ft<f[1]) {a[2]=a[1];a[1]=aa;f[2]=f[1];f[1]=*ft;} else if(*ft==f[1]){a[0]=aa;a[2]=a[1];f[0]=*ft;f[2]=f[1];a[1]=(a[0]+a[2])/2;f[1]=func(xk,a[1],s);}}}if(*ft>f[1]) {*ft=f[1];aa=a[1];}return aa;}double *gradient(double *xk){double *g,f1,f2,q;int i;g=(double*)malloc(n*sizeof(double));f1=fny(xk);for(i=0;i<n;i++){q=ff;xk[i]=xk[i]+q; f2=fny(xk);g[i]=(f2-f1)/q; xk[i]=xk[i]-q;}return g;}double * bfgs(double *xk){double u[n],v[n],h[n][n],dx[n],dg[n],s[n];double aa,ib;double *ft,*xk1,*g1,*g2,*xx,*x0=xk;double fi;int i,j,k;ft=(double *)malloc(sizeof(double));xk1=(double *)malloc(n*sizeof(double));for(i=0;i<n;i++){s[i]=0;for(j=0;j<n;j++){h[i][j]=0;if(j==i) h[i][j]=1;}}g1=gradient(xk);fi=fny(xk);x0=xk;for(k=0;k<n;k++){ib=0;if(ia==1) { xx=xk; break; }ib=0;for(i=0;i<n;i++) s[i]=0;for(i=0;i<n;i++)for(j=0;j<n;j++)s[i]+= -h[i][j]*g1[j];aa=lagrange(xk,ft,s);xk1=iterate(xk,aa,s);g2=gradient(xk1);for(i=0;i<n;i++)if((fabs(g2[i])>=ac)&&(fabs(g2[i]-g1[i])>=ac)){ib=ib+1;}if(ib==0) { xx=xk1; break; }fi=*ft;if(k==n-1){ int j;xk=xk1;for(i=0;i<n;i++)for(j=0;j<n;j++){h[i][j]=0;if(j==i) h[i][j]=1;}g1=g2; k=-1;}else{int j;double a1=0,a2=0;for(i=0;i<n;i++){dg[i]=g2[i]-g1[i];dx[i]=xk1[i]-xk[i];}for(i=0;i<n;i++){int j;u[i]=0;v[i]=0;for(j=0;j<n;j++){u[i]=u[i]+dg[j]*h[j][i];v[i]=v[i]+dg[j]*h[i][j];}}for(j=0;j<n;j++){a1+=dx[j]*dg[j];a2+=v[j]*dg[j];}if(fabs(a1)!=0){a2=1+a2/a1;for(i=0;i<n;i++)for(j=0;j<n;j++)h[i][j]+=(a2*dx[i]*dx[j]-v[i]*dx[j]-dx[i]*u[j])/a1;}xk=xk1; g1=g2;}}if(*ft>fi) { *ft=fi; xx=xk;}xk=x0;return xx;}void main (){int k;double *xx,f;double xk[n]={1,1};xx=bfgs(xk);f=fny(xx);printf("\n\nThe Optimal Design Result Is:\n");for(k=0;k<n;k++){printf("\nk=%d\n\tx[%d]*=%f",k,k+1,xx[k]);}printf("\n\tf*=%f",f);getch();}4、运行结果:三、复合形法1、数学模型168,F 222121--=x x x x )( 12221200250x x x x ⎧≥⎪≥⎨⎪--≥⎩2、复合形法简介复合形法是指n 维空间上取k (12n k n +≤≤)个点作为顶点所构成的n 维超多面体。

相关主题