机械优化设计实验报告_第1页
机械优化设计实验报告_第2页
机械优化设计实验报告_第3页
机械优化设计实验报告_第4页
机械优化设计实验报告_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品文档 机械优化设计 实验报告 目录 1进退法确定初始区间 3 1.1进退法基本思路 3 1.2进退法程序框图3 1.3题目3 1.4源程序代码及运行结果 3 2黄金分割法4 2.2黄金分割法流程图 4 2.3题目5 2.4源程序代码及结果5 3牛顿型法5 3.1牛顿型法基本思路6 3.2阻尼牛顿法的流程图 6 3.3题目6 3.4源程序代码及结果6 4. 鲍威尔法7 4.1鲍威尔法基本思路 7 4.2鲍威尔法流程图7 4. 3题目8 4.4源程序代码及结果8 5. 复合形法15 5.1复合行法基本思想 15 5.3源程序代码及结果16 6. 外点惩罚函数法23 6.1解题思路:23 6.2

2、流程框图23 6.3题目23 6.4源程序代码及结果 24 7. 机械设计实际问题分析 29 7.2计算过程如下29 7.3源程序编写31 8. 报告总结32 1进退法确定初始区间 1.1进退法基本思路:按照一定的规则试算若干个点,比较其函数值的 大小,直至找到函数值按“高-低-高”变化的单峰区间。 1.2进退法程序框图 /(ai) aft TTK孟A亠爲J 1.3题目:用进退法求解函数fxx2 7x 10的搜索区间 1.4源程序代码及运行结果 #in elude #in elude mai n() float h,h0,y1,y2,y3,a1=0,a2,a3,fa2,fa3; scan f(

3、hO=%f,y 1= %f, h=h0;a2=h;y2=a2*a2-7*a2+10; if (y2y1) h=-h;a3=a1;y3=y1; loop:a 1=a2;y1=y2;a2=a3;y2=y3; a3=a2+2*h;y3=a3*a3-7*a3+10; if (y3eps) if (y1=y2) a=a1; a1=a2; y1=y2; a2=a+0.618*(b-a); y2=f(a2); else b=a2;a2=a1;y2=y1; a1= b-0.618*(b-a); y1=f(a1); end end xxx=0.5*(a+b) f = In li ne fun cti on: f

4、(x) = xA2-7*x+9 xxx = 3.4997 3. 牛顿型法 3.1牛顿型法基本思路:在xk邻域内用一个二次函数x来近 似代替原目标函数,并将 x的极小点作为对目标函数f x求优的下一个迭 代点xk 1。经多次迭代,使之逼近目标函数 f x的极小点。 3.2阻尼牛顿法的流程图: 给定X0 k 0 dk 2f(xk)1 f(xk) T xk1 xk kdk| k k 1 k:mi nf(xkdk) 3.3题目:用牛顿阻尼法求函数fx-!,x2x12 4x,2x2的极小点 3.4源程序代码及结果: k=0; ptol=1.0e-5; xk=in put(in put xO:) itcl

5、=1;1; whileno rm(itcl)=ptol f1=4*xk(1,1)A3-24*xk(1,1F2+50*xk(1,1)-4*xk(2,1)-32;-4*xk(1,1)+8*xk( 2,1); G=12*xk(1,1)A2-48*xk(1,1)+50,-4;-4,8; dk=-inv(G)*f1; a=-(dk*f1)/(dk*G*dk); xk=xk+a*dk; itcl=a*dk; k=k+1; end f=(xk(1,1)-2)A4+(xk(1,1)-2*xk(2,1)A2; fprintf( n o ?Xe ?d ? ? 0咆(?0 6卩? ?D? ? x*? ?D?y f

6、?a:n disp(xk); disp(f); 结果显示:in put x0:1;1 用阻尼牛顿法迭代 27次后得到极小点x*及极小值f为: 2.0000 1.0000 1.3270e-019 4. 鲍威尔法 4.1鲍威尔法基本思路:在不用导数的前提下,在迭代中逐次构造 轭方向。 ,k); G的共 4.2鲍威尔法流程图: 4. 3 题目:求函数 f(x) = x0*x0+x1*x1-x0*x1-10*x0-4*x1+60 的最优点,收敛精度 ff=x0*x0+x1*x1-x0*x1-10*x0-4*x1+60; return(ff); void jtf(double xO,double hO,

7、double s,i nt n,double a,double b) int i; double *x3,h,f1,f2,f3; for(i=0;i3;i+) xi=(double *)malloc( n*sizeof(double); h=h0; for(i=0;i n ;i+) *(x0+i)=x0i; f1=objf(x0); for(i=0;i =f1) h=-h0; for(i=0;i n ;i+) *(x2+i)=*(x0+i); f3=f1; for(i=0;i n ;i+) *(x0+i)=*(x1+i); *(x1+i)=*(x2+i); f1=f2; f2=f3; for(

8、;) h=2*h; for(i=0;i n ;i+) *(x2+i)=*(x1+i)+h*si; f3=objf(x2); if(f2f3) break; else for(i=0;i n ;i+) *(x0+i)=*(x1+i); *(x1+i)=*(x2+i); f1=f2; f2=f3; if(h0) for(i=0;i n ;i+) ai=*(x2+i); bi=*(x0+i); else for(i=0;i n ;i+) ai=*(x0+i); bi=*(x2+i); for(i=0;i3;i+) free(xi); double gold(double a,double b,dou

9、ble eps,i nt n, double xx) int i; double f1,f2,*x2,ff,q,w; for(i=0;i2;i+) xi=(double *)malloc( n*sizeof(double); for(i=0;i f2) for(i=0;i n ;i+) bi=*(x0+i); *(x0+i)=*(x1+i); f1=f2; for(i=0;i n ;i+) *(x1+i)=ai+0.382*(bi-ai); f2=objf(x1); else for(i=0;i n ;i+) ai=*(x1+i); *(x1+i)=*(x0+i); f2=f1; for(i=

10、0;i n ;i+) *(x0+i)=ai+0.618*(bi-ai); f1=objf(x0); q=0; for(i=0;i eps); for(i=0;i n ;i+) xxi=0.5*(ai+bi); ff=objf(xx); for(i=0;i2;i+) free(xi); return(ff); double on eoptim(double xO,double s,double hO,double epsg,i nt n, double x) double *a,*b,ff; a=(double *)malloc( n*sizeof(double); b=(double *)ma

11、lloc( n*sizeof(double); jtf(xO,hO,s, n, a,b); ff=gold(a,b,epsg, n,x); free(a); free(b); return (ff); double powell(double p,double h0,double eps,double epsg,i nt n, double x) int i,j,m; double *xx4,*ss,*s; double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d; ss=(double *)malloc (n*(n+1)*sizeof(double); s=(double

12、 *)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;i4;i+) xxi=(double *)malloc (n *sizeof(double); for(i=0;i n ;i+) *(xx0+i)=pi; for(;) for(i=0;i n ;i+) *(xx1+i)=*(xx0+i); xi=*(xx1+i); fO=f1=objf(x); dlt=-1; for(j=0;j n ;j+) for(i=0;i dlt) d

13、lt=df; m=j; sdx=0; for(i=0;i n ;i+) sdx=sdx+fabs(xi-(*(xx1+i); if(sdxeps) free(ss); free(s); for(i=0;i4;i+) free(xxi); return (f); for(i=0;i n ;i+) *(xx2+i)=xi; f2=f; for(i=0;i n ;i+) *(xx3+i)=2*(*(xx2+i)-(*(xx1+i); xi=*(xx3+i); fx=objf(x); f3=fx; q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt); d=0.5*dlt*(f

14、1-f3)*(f1-f3); if(f3f1)|(qd) if(f2=f3) for(i=0;i n ;i+) *(xx0+i)=*(xx2+i); else for(i=0;i n ;i+) *(xx0+i)=*(xx3+i); else for(i=0;i n ;i+) *(ss+(i+1)* (n+1)=xi-(*(xx1+i); *(s+i)=*(ss+(i+1)* (n+1); f=on eoptim(xx0,s,h0,epsg, n,x); for(i=0;i n ;i+) *(xx0+i)=xi; for(j=m+1;j=n ;j+) for(i=0;i n ;i+) *(ss+

15、i*( n+1)+j-1)=*(ss+i*( n+1)+j); void mai n() double p=1,2; double ff,x2; ff=powell(p,0.3,0.001,0.0001,2,x); prin tf(x0=%f,x1=%f,ff=%fn,x0,x1,ff); getchar(); 5. 复合形法 5.1复合行法基本思想:在可行域中选取 K个设计点(n+1W K 2n)作为初始复合形的顶点。比较各顶点目标函数值的大小, 去掉目标函数值最大的顶点(称最坏点),以坏点以外其余各点的 中心为映射中心,用坏点的映射点替换该点,构成新的复合形顶 点。反复迭代计算,使复合形不

16、断向最优点移动和收缩,直至 收缩到复合形的顶点与形心非常接近,且满足迭代精度要求为 止。 5.2题目:求函数f(x)=(x1-5)*(x1-5)+4*(x2-6)*(x2-6)的最优点,约束条件 为 g1(x)=64-x1*x1-x2*x2 0; g2(x)=x2-x1-10 0; g3(x)=x1-10 0;收敛精度 /* 申请矩阵空间 */ double f(double *); /* 目标函数 */ double *g(double *); /* 约束函数 */ bool judge(double *); /* 可行点的判断 */ int mai n() int n,k; int i,j

17、,k1; int l; double temporary; double restrain; /*收敛条件 */ double reflect; /*反射系数 */ sran d( un sig ned)time(NULL); printf(请输入目标函数的维数n:); /*输入已知数据*/ sca nf(%d, printf(请输入复合形的顶点数k:); sca nf(%d, double *x=apply(k,n); /* 存放复合形顶点 */ double *y=(double *)calloc(k,sizeof(double); /* 存放目标函数值 */ double *p=(dou

18、ble *)calloc(3,sizeof(double); /* 存放约束函数值 */ double *a=(double *)calloc(n,sizeof(double); /* 存放设计变量的下限 */ double *b=(double *)calloc(n,sizeof(double); /* 存放设计变量的上限 */ double *x_c=(double *)calloc(n,sizeof(double); /* 存放可行点中心 */ double *x_r=(double *)calloc(n,sizeof(double); /* 存放最坏点的反射点 */ printf(请输

19、入选定的第一个可行点x1(包含%d个数):,n); for(i=0;i n;i+) scan f(%lf,*x+i); printf(请输入初选变量的下限a(包含%d个数):,n); for(i=0;in;i+) scanf(%lf,a+i); printf(请输入初选变量的上限b(包含%d个数):,n); for(i=0;in;i+) scanf(%lf,b+i); printf(输出输入结果为:nn=%d,k=%d,x1=(,n,k); /*输出已知数据*/ for(i=0;i n-1;i+) prin tf(%.5lf ,*(*x+i); prin tf(%.5lf)na=(,*(*x+

20、n-1); for(i=0;i n-1;i+) prin tf(%f ,*(a+i); prin tf(%.5lf),b=(,*(a+n-1); for(i=0;i n-1;i+) prin tf(%f ,*(b+i); prin tf(%.5lf)n,*(b+n-1); L1: for(i=1;ik;i+) /*随机得到其余(k-1)个可行点*/ for(j=0;j n ;j+) *(*(x+i)+j)=*(a+j)+(double)(ra nd()%10000)/10000*(*(b+j)-*(a+j); l=1; for(i=1;ik;i+) /*找出可行点的个数l,并把可行点放在前l个

21、位置上*/ if(judge(*(x+i) for(j=1;jk;j+) if(!judge(*(x+j) for(k 1=0;k1 n;k1+) temporary=*(*(x+i)+k1); *(*(x+i)+k1)=*(*(x+j)+k1); *(*(x+j)+k1)=temporary; break; I+; for(i=0;il-1;i+)/*把前I个可行点按目标函数值从大到小排序*/ for(j=i+1;jl;j+) if(f(*(x+i)vf(*(x+j) for(k 1=0;k1 n;k1+) temporary=*(*(x+i)+k1); *(*(x+i)+k1)=*(*(x

22、+j)+k1); *(*(x+j)+k1)=temporary; for(i=0;in;i+) /* 求可行点中心 */ *(x_c+i)=0; for(i=0;iI;i+) for(j=0;j n ;j+) *(x_c+j)+=*(*(x+i)+j); for(i=0;i n ;i+) *(x_c+i)/=l; if(!judge(x_c) /*判断可行点中心是否可行*/ for(i=0;i n ;i+) *(a+i)=*(*(x+l-1)+i); *(b+i)=*(x_c+i); goto L1; else for(i=l;ik;i+)/*将不可行点可行化*/ do for(j=0;j n

23、 ;j+) *(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j); while (!judge(*(x+i); L2: for(i=0;ik-1;i+) /*将可行点按目标函数值从大到小排序*/ for(j=i+1;jk;j+) if(f(*(x+i)f(*(x+j) for(k1=0;k1 n;k1+) temporary=*(*(x+i)+k1); *(*(x+i)+k1)=*(*(x+j)+k1); *(*(x+j)+k1)=temporary; restrain=0; /*求收敛条件*/ for(i=0;ik;i+) restrai n+=(f(

24、*(x+i)-f(*(x+k-1)*(f(*(x+i)-f(*(x+k-1); */ 为:(); restrai n=sqrt(1.0/(k-1)*restrai n); if(restrai * E0) /*判断收敛条件 printf(n求得约束最优点 for(i=0;i n ;i+) prin tf(%.5f ,*(*(x+k-1)+i); prin tf()n目标函数的最优 解为:%.5fn,f(*(x+k-1); return 0; else L3: for(i=0;in;i+) /*计算除去最坏点*x外的(k-1)个顶点的中心*/ *(x_c+i)=O; for(i=1;ik;i+)

25、 for(j=0;j n ;j+) *(x_c+j)+=*(*(x+i)+j); for(i=0;i n ;i+) *(x_c+i)/=k-1; reflect=1.3; L4: for(i=0;in;i+) /* 求反射点 */ *(x_ 叶i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i); if(!judge(x_r) reflect*=0.5; goto L4; else if (f(x_r)f(*x) for(i=0;in;i+) *(*x+i)=*(x_r+i); goto L2; else if(reflect=1e-10) for(i=0;in;i+)

26、*(*x+i)=*(*(x+1)+i); goto L3; else reflect*=0.5; goto L4; double *apply(int row,int col) /* 申请矩阵空间 */ int i; double *x=(double*)calloc(row*col,sizeof(double); double *y=(double *)calloc(row,sizeof(double *); if(!x | !y) printf(内存分配失败!); exit(1); for(i=0;irow;i+) *(y+i)=x+i*col; retur n y; double f(d

27、ouble *x) /* 目标函数 */ return (*x-5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)-6); double *g(double *x) /* 约束函数 */ double *p=(double *)calloc(3,sizeof(double); if(!p) printf(内存分配失败!); exit(1); *p=64-(*x)*(*x)-(*(x+1)*(*(x+1); *(p+1)=*(x+1)-*x-10; *(p+2)=*x-10; return p; bool judge(double *x) /* 可行点的判断 */ int i; dou

28、ble *p=(double *)calloc(3,sizeof(double); p=g(x); for(i=0;i0) break; if(i=3) retur n true; else return false; 1 GLl3enAdmini叫Desktop、忧览设计实岀,复仝序云、D e bu 口复合行i去.e藍亡 - 5 5 T :20 26 2e.eeeBa 14 才.-卑歹曲晟估口斗; 5 . 218 ? S.36326 自踪匾巖能肾另:0 ” 0*3?2 rests Ninjyp key to cent inue 6. 外点惩罚函数法 6.1解题思路:外点法是从可行域的外部构造

29、一个点序列去逼近原 约束问题的最优解。外点法可以用来求解含不等式和等式约束 的优化问题。外点惩罚函数的形式为: l rhj(x)2 j i m (x,r) 2 f (x) r max0,gi(x) i 1 6.2流程框图: 6.3 题目:求函数 f(x)=(x1-5)*(x1-5)+4*(x2-6)*(x2-6)的最优点,约束条件: g1(x)=64-x1*x1-x2*x2 0; g2(x)=x2-x1-10 0 ; g3(x)=x1-10 0;收敛精度 6.4源程序代码及结果: #i nclude #i nclude #in clude double lamta10=0, 1.0 ,0 ,0

30、 ,0 ,1 ,0 ,0 ,0 ,1;/ 鲍威尔方法初始化方向,线性无关 double lamta13=0, 0,0;/ 暂存新的搜索方向 double x14=0, 0 ,0, 0 ;/x1到x3用于存储各共轭方向的点 double x24=0, 0 ,0, 0 ; double x34=0, 0 ,0, 0 ; double x44=0, 0 ,0, 0 ;/x4 用于中间判断 double x54=0, 0 ,0, 0 ;/x5用存放于更换方向后产生的新点 int m=0;/ 标志 double x_4=0, 0, 0, 0;/暂存鲍威尔最优解 double x04=0, 2, 2,2;

31、/ 初值 double c=10;递减系数 double e=0.00001;/精 度控制 double r0=1;/初始惩罚因子 double r=1; 函数声明部分 void Powell(double r);/ 鲍威尔方法函数 double fxy(double x1,double x2,double x3,double r); /待求函数 double ysearch(double x); /一维搜索的目标函数 void search(double / 区间搜索 double yellowcut(double /黄金分割 void sort(double *p,int size);/选

32、择法排序 void mai n()/约束优化方法主函数入口 cout请输入精度 e; cha ngya n:Powell(r); double cmpare4; int flag1=0; for (i nt i=1;i=3;i+) cmparei=x_i-x0i; if (fabs(cmparei)e) flag1+; if (flag 仁=3) prin tf(x1=%lfx2=%lfn,x_1,x_2); / cout最优解为:x1=x_1vvx2=vx_2vv vvx3=vvx_3ve ndl ; cout最小值为vfxy(x_1,x_2,x_3,r)vvendl; else for (

33、i nt j=1;j0)?(64-x1*x1-x2*x2):0; n=(x2-x1-10)0)?(x2-x1-10):0; p=(x1-10)0)?(x1-10):0; return惩罚函数 (x1-5)*(x1-5)+4*(x2-6)*(x2-6)+r*(m*m+n*n+p*p)+r*(x3*x3); void Powell(double r)/鲍威尔方法函数定义 double det=0.0001;迭代精度 int k; my1: for (k=1;k=3;k+) m=3*k-2; double a=0,b=0,xo=0; search(a,b,1); 完成区间搜索 double temp

34、; temp=yellowcut(a,b); 黄金分割法 int n=3*k-2; for (i nt i=1;i SOXHSOX) (+10“己丁二)04 (寸4VS2)七 (aABHAQorG寸4+0)二一 O-S寸 X-S寸 X-E 寸 X)AX4 F7M1TS2 X0M1T04 SS22Qqnop s二 oxox%三寸 X (+=ohv:=l.iid04 話总七os 主L 土二A工三阳MAD (+:=evo上一 1)04 F7MB Qqnopo-sex-sex-DoXMXlrsB -(-SCXIX-SCXIXLorx) AXlraB o-sLX-sLX-ELXMXlrEB -(-sox

35、-soxLox) AXlroB 于M4 Qqnop S05 F7OXHSIX FToXHalx xlexheix asmfl窒二oHH6e_4二一 宀+6eE (a)pv (曰 dEgsq 国二一 兰 Ox 宀oXHRdE。 (+土OHVLHlurOJ OH6Q二 u 一 -寸一dluo -qnop 精品文档 goto myl; else for (i nt t=0;t3;t+) lamta1t=x3t+1-x0t+1; m=0;/switch 标志! double aa=0,bb=0; search(aa,bb,1); double temp1; temp1=yellowcut(aa,bb)

36、; for (i nt i=1;i=3;i+) x5i=x3i+temp1*lamta1i-1; for (i=1;i=3;i+) x0i=x5i; for (i=1;i=6;i+) lamtai=lamtai+3; for (i=1;i=y1) h=-h,a3=a1,y3=y1; a仁 a2,y 仁 y2,a2=a3,y2=y3; a3=a2+h,y3=ysearch(a3); while(y3=y2) h=2*h; a1= a2,y1=y2,a2=a3,y2=y3; a3=a2+h,y3=ysearch(a3); if(h0)a=a3,b=a1; else a=a1,b=a3; /黄金分割

37、法求解 double yellowcut(double e=0.001; double c,fc; c=a+0.382*(b-a); fc=ysearch(c); double d,fd; double xo; d=a+0.618*(b-a); fd=ysearch(d); Iabel2: if (fc=fd) b=d; d=c; fd=fc; c=a+0.382*(b-a); fc=ysearch(c); else a=c; c=d; fc=fd; d=a+0.618*(b-a); fd=ysearch(d); if (b-a)=e) xo=(a+b)/2; else goto label2

38、; return xo; void sort(double *p,int size)/ 选择法排序 int i,j; double k; for(i=0;isize-1;i+) for(j=i+1;j*(p+j)k=*(p+i);*(p+i)=*(p+j);*(p+j)=k; 7. 机械设计实际问题分析 7.1题目:图示为一对称的两杆支架,在支架的顶点承受一个载荷为 2F=300000,支架之间的水平距离2B=1520mm,若已选定壁厚T=2.5mm钢管, 由于支架为空心杆, 题意可得方程组: 2 2.1 10 655.4, 700 106 失效形式主要为屈服,故计算稳定性用屈服极限公式。根据 2 2B 2 R2 r2 FisA s R2r2 R r T ,F1 2Fsin 4 代入整理得到内点混合惩罚函数法的标准形式为: f x42.4315 Xi2 x; glx儿0 g2xX2 0 22 g3x96.46 Xi X2 0 h xx1 x2 2.5 0 构建惩罚函数: Xr 84.86 x: x; r(k)xf r k xf r k 96.46 xf x; 2 x1x22.5 cr k ,其中r的初值r0 1, 0.1, 0,0 T, X,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论