基于鲍威尔算法的阶梯轴优化设计
- 格式:doc
- 大小:259.00 KB
- 文档页数:10
基于鲍威尔算法的阶梯轴优化设计一.鲍威尔方法鲍威尔(Powell)法是直接利用函数值来构造共轭方向的一种方法对函数:基本思想:在不用导数的前提下,在迭代中逐次构造G 的共轭方向1.共轭方向的生成设xk, xk+1为从不同点出发,沿同一方向dj进行一维搜索而到的两个极小点.梯度和等值面相垂直的性质, dj和xk, xk+1两点处的梯度gk,gk+1之间存在关系:另一方面,对于上述二次函数,其xk, xk+1两点处的梯度可表示为:这说明只要沿dj方向分别对函作两次一维搜索,得到两个极小点xk和xk+1 ,那么这两点的连线所给出的方向dk就是与dj一起对G共轭的方向。
2.基本算法二维情况描述鲍威尔的基本算法:1)任选一初始点x0,再选两个线性无关的向量,如坐标轴单位向量e1=[1,0]T 和e2=[0,1]T作为初始搜索方向。
2)从x0出发,顺次沿e1,e1作一维搜索,得点,两点连线得一新方向d1用d1代替e1形成两个线性无关向量d1 ,e2 ,作为下一轮迭代的搜索方向。
再从出发,沿d1作一维搜索得点,作为下一轮迭代的初始点。
3)从出发,顺次沿e2,d1 作一维搜索,得到点,两点连线得一新方向:沿d2作一维搜索得点x2 .即是二维问题的极小点x* .方法的基本迭代格式包括共轭方向产生和方向替换两主要步骤。
把二维情况的基本算法扩展到n维,则鲍威尔基本算法的要点是:在每一轮迭代中总有一个始点(第一轮的始点是任选的初始点)和n个线性独立的搜索方向。
从始点出发顺次沿n个方向作一维搜索得一终点,由始点和终点决定了一个新的搜索方向。
用这个方向替换原来n个方向中的一个,于是形成新的搜索方向组。
替换的原则是去掉原方向组的第一个方向而将新方向排在原方向的最后。
此外规定,从这一轮的搜索终点出发沿新的搜索方向作一维搜索而得到的极小点,作为下一轮迭代的始点。
这样就形成算法的循环。
因为在迭代中的n个搜索方向有时会变成线性相关而不能形成共轭方向。
这时张不成n维空间,可能求不到极小点,所以上述基本算法有待改进。
3.改进的算法在鲍威尔基本算法中,每一轮迭代都用连结始点和终点所产生出的搜索方向去替换原向量组中的第一个向量,而不管它的“好坏”,这是产生向量组线性相关的原因所在。
在改进的算法中首先判断原向量组是否需要替换。
如果需要替换,还要进一步判断原向量组中哪个向量最坏,然后再用新产生的向量替换这个最坏的向量,以保证逐次生成共轭方向。
为此,要解决两个关键问题:(1)dk+1是否较好?是否应该进入新的方向组?即方向组是否进行更新?(2)如果应该更新方向组,dk+1不一定替换方向,而是有选择地替换某一方向令在k次循环中分别称为一轮迭代的始点、终点和反射点。
则在循环中函数下降最多的第m次迭代是相应的方向为为了构成共轭性好的方向组,须遵循下列准则 在k 次循环中,若满足条件:则选用新方向dk ,并在第k+1迭代中用dk 替换对应于的方向。
否则,仍然用原方向组进行第k+1迭代这样重复迭代的结果,后面加进去的向量都彼此对G 共轭,经n 轮迭代即可得到一个由n 个共轭方向所组成的方向组。
对于二次函次,最多n 次就可找到极小点,而对一般函数,往往要超过n 次才能找到极小点(这里“n ”表示设计空间的维数)。
二.利用鲍威尔方法优化阶梯轴 如下图为一阶梯轴,各段长度已知,求在满足动力条件下使质量为最小时的直径X1,X2.1.设计变量的确定X=⎥⎦⎤⎢⎣⎡10x x 2.目标函数的建立一质量W 作为目标函数,若所选材料密度为p ,则目标函数为: W= p πl/4*x[0]*x[0]+2*x[1]*x[1]-4*x[0]-2*x[0]*x[1] 3.编写程序用ff表示目标函数W,选用材料45号港,密度为7.85,则处理前面数据pπl/4为271#include "stdio.h"#include "stdlib.h"#include "math.h"double objf(double x[]){double ff;ff=x[0]*x[0]+2*x[1]*x[1]-4*x[0]-2*x[0]*x[1];return(ff);}void jtf(double x0[ ],double h0,double s[ ],int n,double a[ ],double b[ ]){int i;double *x[3],h,f1,f2,f3;for (i=0;i<3;i++)x[i]=(double *)malloc (n*sizeof(double));h=h0;for(i=0;i<n;i++)*(x[0]+i)=x0[i];f1=objf(x[0]);for(i=0;i<n;i++)*(x[1]+i)=*(x[0]+i)+h*s[i];f2=objf(x[1]);if(f2>=f1){h= -h0;for (i=0;i<n;i++)*(x[2]+i)=*(x[0]+i);f3=f1;for(i=0;i<n;i++){*(x[0]+i)= *(x[1]+i);*(x[1]+i)= *(x[2]+i);}f1=f2;f2=f3;}for(;;){h=2. *h;for(i=0;i<n;i++)*(x[2]+i)=* (x[1]+i) +h*s[i];f3= objf(x[2]);if(f2<f3)break;else{ for(i=0;i<n;i++){*(x[0]+i)= *(x[1]+i);*(x[1]+i)= *(x[2]+i);}f1=f2;f2=f3;}}if(h<0. )for(i=0;i<n;i++){a[i]=*(x[2]+i);b[i]=*(x[0]+i);}elsefor(i=0;i<n;i++){a[i]=*(x[0]+i);b[i]=*(x[2]+i);}for(i=0;i<3;i++)free(x[i]);}double gold(double a[],double b[],double eps,int n,double xx[]) {int i;double f1,f2,*x[2],ff,q,w;for(i=0;i<2;i++)x[i]=(double*)malloc (n*sizeof(double));for(i=0;i<n;i++){*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);}f1=objf(x[0]);f2=objf(x[1]);do{if(f1>f2){for(i=0;i<n;i++){b[i]=*(x[0]+i);*(x[0]+i)=*(x[1]+i);}f1=f2;for(i=0;i<n;i++)*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);f2=objf(x[1]);}else{for(i=0;i<n;i++){a[i]=*(x[1]+i);*(x[1]+i)=*(x[0]+i);}f2=f1;for(i=0;i<n;i++)*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);f1=objf(x[0]);}q=0;for(i=0;i<n;i++)q=q+(b[i]-a[i])*(b[i]-a[i]);w=sqrt(q);}while(w>eps);for(i=0;i<n;i++)xx[i]=0.5*(a[i]+b[i]);ff=objf(xx);for(i=0;i<2;i++)free(x[i]);return(ff);}double oneoptim(double x0[],double s[],double h0,double epsg,int n,double x[]) {double *a,*b,ff;a=(double *)malloc(n*sizeof(double));b=(double *)malloc(n*sizeof(double));jtf(x0,h0,s,n,a,b);ff=gold(a,b,epsg,n,x);free(a);free(b);}double powell(double p[],double h0,double eps,double epsg,int n,double x[]) {int i,j,m;double *xx[4],*ss,*s;double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;ss=(double *)malloc(n*(n+1)*sizeof(double));s=(double *)malloc(n*sizeof(double));for (i=0;i<n;i++){for (j=0;j<=n;j++)*(ss+i*(n+1)+j)=0;*(ss+i*(n+1)+i)=1;}for (i=0;i<4;i++)xx[i]=(double *)malloc(n*sizeof(double));for (i=0;i<n;i++)*(xx[0]+i)=p[i];for(;;){for (i=0;i<n;i++){*(xx[1]+i)=*(xx[0]+i);x[i]=*(xx[1]+i);}f0=f1=objf(x);dlt=-1;for (j=0;j<n;j++){for (i=0;i<n;i++){*(xx[0]+i)=x[i];*(s+i)=*(ss+i*(n+1)+j);}f=oneoptim(xx[0],s,h0,epsg,n,x);df=f0-f;if(df>dlt){dlt=df;m=j;}}sdx=0.;for (i=0;i<n;i++)sdx=sdx+fabs(x[i]-(*(xx[1]+i)));if(sdx<eps){free(ss);free(s);for (i=0;i<4;i++)free(xx[i]);}for (i=0;i<n;i++)*(xx[2]+i)=x[i];f2=f;for (i=0;i<n;i++){*(xx[3]+i)=2.*(*(xx[2]+i)-(*(xx[1]+i))); x[i]=*(xx[3]+i);}fx=objf(x);f3=fx;q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt);d=0.5*dlt*(f1-f3)*(f1-f3);if((f3<f1)||(q<d)){if(f2<=f3)for (i=0;i<n;i++)*(xx[0]+i)=*(xx[2]+i);elsefor (i=0;i<n;i++)*(xx[0]+i)=*(xx[3]+i);}else{for (i=0;i<n;i++){*(ss+(i+1)*(n+1))=x[i]-(*(xx[1]+i));*(s+i)=*(ss+(i+1)*(n+1));}f=oneoptim(xx[0],s,h0,epsg,n,x);for(i=0;i<n;i++)*(xx[0]+i)=x[i];for (j=m+1;j<=n;j++)for (i=0;i<n;i++)*(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);}}}void main(){double p[]={1,1};double ff,x[2];ff=powell(p,0.3,0.001,0.0001,2,x);printf("输出最优点及其目标函数值:\n"); printf("x[0]=%f,x[1]=%f,ff=%f",x[0],x[1],ff);} 运行得出结果为。