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

下载本文档

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

文档简介

《机械优化设计》实验报告目录1.进退法确定初始区间 3进退法基本思路 3进退法程序框图 3题目 4源程序代码及运行结果 42.黄金分割法 5黄金分割法流程图 5题目 5源程序代码及结果 53.牛顿型法 6牛顿型法基本思路 6阻尼牛顿法的流程图 6题目 7源程序代码及结果 74.鲍威尔法 8鲍威尔法基本思路 8鲍威尔法流程图 84.3题目 9源程序代码及结果 95.复合形法 16复合行法基本思想 16源程序代码及结果 166.外点惩罚函数法 24解题思路: 24流程框图 24题目 24源程序代码及结果 247.机械设计实际问题分析 30计算过程如下 30源程序编写 328.报告总结 331.进退法确定初始区间进退法基本思路:按照一定的规则试算若干个点,比较其函数值的大小,直至找到函数值按“高-低-高”变化的单峰区间。进退法程序框图题目:用进退法求解函数的搜索区间源程序代码及运行结果#include<>#include<>main(){ floath,h0,y1,y2,y3,a1=0,a2,a3,fa2,fa3; scanf("h0=%f,y1=%f",&h0,&y1); h=h0;a2=h;y2=a2*a2-7*a2+10; if(y2>y1) { h=-h;a3=a1;y3=y1;loop:a1=a2;y1=y2;a2=a3;y2=y3; } a3=a2+2*h;y3=a3*a3-7*a3+10; if(y3<y2) { gotoloop; } else printf("a1=%f,a2=%f,a3=%f,y1=%f,y2=%f,y3=%f\n",a1,a2,a3,y1,y2,y3);}搜索区间为062.黄金分割法黄金分割法基本思路:通过不断的缩短单峰区间的长度来搜索极小点的一种有效方法。按()缩小比较大小确定取舍区间。黄金分割法流程图题目:对函数,给定搜索区间时,试用黄金分割法求极小点源程序代码及结果:f=inline('x^2-7*x+9')a=0;b=8;eps=;a1=*(b-a);y1=f(a1);a2=a+*(b-a);y2=f(a2);while(abs(b-a)>eps)if(y1>=y2)a=a1;a1=a2;y1=y2;a2=a+*(b-a);y2=f(a2);elseb=a2;a2=a1;y2=y1;a1=*(b-a);y1=f(a1);endendxxx=*(a+b)f=Inlinefunction:f(x)=x^2-7*x+9xxx=3.牛顿型法牛顿型法基本思路:在邻域内用一个二次函数来近似代替原目标函数,并将的极小点作为对目标函数求优的下一个迭代点。经多次迭代,使之逼近目标函数的极小点。阻尼牛顿法的流程图:题目:用牛顿阻尼法求函数的极小点源程序代码及结果:k=0;ptol=;xk=input('inputx0:')itcl=[1;1];whilenorm(itcl)>=ptolf1=[4*xk(1,1)^3-24*xk(1,1)^2+50*xk(1,1)-4*xk(2,1)-32;-4*xk(1,1)+8*xk(2,1)];G=[12*xk(1,1)^2-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;endf=(xk(1,1)-2)^4+(xk(1,1)-2*xk(2,1))^2;fprintf('\nó?×è?á?£?ù·¨μü′ú%d′?oóμ?μ???D?μ?x*?°??D??μf?a:\n',k);disp(xk);disp(f);结果显示:inputx0:[1;1]用阻尼牛顿法迭代27次后得到极小点x*及极小值f为:4.鲍威尔法鲍威尔法基本思路:在不用导数的前提下,在迭代中逐次构造G的共轭方向。鲍威尔法流程图:4.3题目:求函数f(x)=x[0]*x[0]+x[1]*x[1]-x[0]*x[1]-10*x[0]-4*x[1]+60的最优点,收敛精度ε=源程序代码及结果:#include""#include""#include""doubleobjf(doublex[]){doubleff;ff=x[0]*x[0]+x[1]*x[1]-x[0]*x[1]-10*x[0]-4*x[1]+60;return(ff);}voidjtf(doublex0[],doubleh0,doubles[],intn,doublea[],doubleb[]){inti;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]);}doublegold(doublea[],doubleb[],doubleeps,intn,doublexx[]){inti;doublef1,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]+*(b[i]-a[i]);*(x[1]+i)=a[i]+*(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]+*(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]+*(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]=*(a[i]+b[i]);ff=objf(xx);for(i=0;i<2;i++)free(x[i]);return(ff);}doubleoneoptim(doublex0[],doubles[],doubleh0,doubleepsg,intn,doublex[]){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);return(ff);}doublepowell(doublep[],doubleh0,doubleeps,doubleepsg,intn,doublex[]){inti,j,m;double*xx[4],*ss,*s;doublef,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]);return(f);}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=*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);}}}voidmain(){doublep[]={1,2};doubleff,x[2];ff=powell(p,,,,2,x);printf("x[0]=%f,x[1]=%f,ff=%f\n",x[0],x[1],ff);getchar();}5.复合形法复合行法基本思想:在可行域中选取K个设计点(n+1≤K≤2n)作为初始复合形的顶点。比较各顶点目标函数值的大小,去掉目标函数值最大的顶点(称最坏点),以坏点以外其余各点的中心为映射中心,用坏点的映射点替换该点,构成新的复合形顶点。反复迭代计算,使复合形不断向最优点移动和收缩,直至收缩到复合形的顶点与形心非常接近,且满足迭代精度要求为止。题目:求函数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;收敛精度ε自定义;源程序代码及结果:#include<>#include<>#include<>#include<>#defineE01e-5/*复合形法收敛控制精度*/double**apply(int,int);/*申请矩阵空间*/doublef(double*);/*目标函数*/double*g(double*);/*约束函数*/booljudge(double*);/*可行点的判断*/intmain(){intn,k;inti,j,k1;intl;doubletemporary;doublerestrain;/*收敛条件*/doublereflect;/*反射系数*/srand((unsigned)time(NULL));printf("请输入目标函数的维数n:");/*输入已知数据*/scanf("%d",&n);printf("请输入复合形的顶点数k:");scanf("%d",&k);double**x=apply(k,n);/*存放复合形顶点*/double*y=(double*)calloc(k,sizeof(double));/*存放目标函数值*/double*p=(double*)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("请输入选定的第一个可行点x1(包含%d个数):",n);for(i=0;i<n;i++) scanf("%lf",*x+i);printf("请输入初选变量的下限a(包含%d个数):",n);for(i=0;i<n;i++)scanf("%lf",a+i);printf("请输入初选变量的上限b(包含%d个数):",n);for(i=0;i<n;i++)scanf("%lf",b+i);printf("输出输入结果为:\nn=%d,k=%d,x1=(",n,k);/*输出已知数据*/for(i=0;i<n-1;i++) printf("%.5lf",*(*x+i));printf("%.5lf)\na=(",*(*x+n-1));for(i=0;i<n-1;i++)printf("%f",*(a+i));printf("%.5lf),b=(",*(a+n-1));for(i=0;i<n-1;i++) printf("%f",*(b+i));printf("%.5lf)\n",*(b+n-1));L1:for(i=1;i<k;i++)/*随机得到其余(k-1)个可行点*/ for(j=0;j<n;j++) *(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j)); l=1; for(i=1;i<k;i++)/*找出可行点的个数l,并把可行点放在前l个位置上*/ if(judge(*(x+i))) { for(j=1;j<k;j++) if(!judge(*(x+j))) { for(k1=0;k1<n;k1++) { temporary=*(*(x+i)+k1); *(*(x+i)+k1)=*(*(x+j)+k1); *(*(x+j)+k1)=temporary; } break; } l++; } for(i=0;i<l-1;i++)/*把前l个可行点按目标函数值从大到小排序*/ for(j=i+1;j<l;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; } for(i=0;i<n;i++)/*求可行点中心*/ *(x_c+i)=0; for(i=0;i<l;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); } gotoL1; } else { for(i=l;i<k;i++)/*将不可行点可行化*/ do { for(j=0;j<n;j++) *(*(x+i)+j)=*(x_c+j)+*(*(*(x+i)+j)-*(x_c+j)); } while (!judge(*(x+i)));L2: for(i=0;i<k-1;i++)/*将可行点按目标函数值从大到小排序*/ for(j=i+1;j<k;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;i<k;i++) restrain+=(f(*(x+i))-f(*(x+k-1)))*(f(*(x+i))-f(*(x+k-1))); restrain=sqrt(k-1)*restrain); if(restrain<E0)/*判断收敛条件*/ { printf("\n求得约束最优点为:("); for(i=0;i<n;i++) printf("%.5f",*(*(x+k-1)+i)); printf(")\n目标函数的最优解为:%.5f\n",f(*(x+k-1))); return0; } else {L3: for(i=0;i<n;i++)/*计算除去最坏点*x外的(k-1)个顶点的中心*/ *(x_c+i)=0; for(i=1;i<k;i++) for(j=0;j<n;j++) *(x_c+j)+=*(*(x+i)+j); for(i=0;i<n;i++) *(x_c+i)/=k-1; reflect=;L4: for(i=0;i<n;i++)/*求反射点*/ *(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i)); if(!judge(x_r)) { reflect*=; gotoL4; } elseif (f(x_r)<f(*x)) { for(i=0;i<n;i++)*(*x+i)=*(x_r+i); gotoL2; } elseif(reflect<=1e-10) { for(i=0;i<n;i++)*(*x+i)=*(*(x+1)+i); gotoL3; } else { reflect*=; gotoL4; } } }}double**apply(introw,intcol)/*申请矩阵空间*/{ inti; double*x=(double*)calloc(row*col,sizeof(double)); double**y=(double**)calloc(row,sizeof(double*)); if(!x||!y){printf("内存分配失败!"); exit(1); } for(i=0;i<row;i++) *(y+i)=x+i*col;returny;}doublef(double*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; returnp;}booljudge(double*x)/*可行点的判断*/{ inti;double*p=(double*)calloc(3,sizeof(double));p=g(x);for(i=0;i<3;i++) if (*(p+i)>0)break; if(i==3)returntrue; elsereturnfalse;}6.外点惩罚函数法解题思路:外点法是从可行域的外部构造一个点序列去逼近原约束问题的最优解。外点法可以用来求解含不等式和等式约束的优化问题。外点惩罚函数的形式为:流程框图:题目:求函数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;收敛精度ε=;源程序代码及结果:#include<>#include<>#include<>doublelamta[10]={0,,0,0,0,1,0,0,0,1};械设计实际问题分析题目:图示为一对称的两杆支架,在支架的顶点承受一个载荷为2F=300000,支架之间的水平距离2B=1520mm,若已选定壁厚T=2.5mm钢管,密度p=8300kg/m3,屈服点,材料的弹性模量。要求在满足强度与稳定性条件下设计最轻的支架尺寸。计算过程如下:解:计算压杆的临界柔度为:,由于支架为空心杆,失效形式主要为屈服,故计算稳定性用屈服极限公式。根据题意可得方程组:,代入整理得到内点混合惩罚函数法的标准形式为:构建惩罚函数:,取,解得:令迭代精度为:,由于函数是X的2次方程,故不必判别函数值的相对变化量。源程序编写#include<>#include<>doubleGetX3(doubler){return(1-

温馨提示

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

评论

0/150

提交评论