资源描述
机械优化设计实验报告目录1.进退法确定初始区间31.1 进退法基本思路31.2 进退法程序框图31.3 题目41.4 源程序代码及运行结果42.黄金分割法52.2黄金分割法流程图52.3 题目52.4 源程序代码及结果53.牛顿型法63.1牛顿型法基本思路63.2 阻尼牛顿法的流程图63.3 题目73.4 源程序代码及结果74.鲍威尔法84.1 鲍威尔法基本思路84.2 鲍威尔法流程图843 题目94.4 源程序代码及结果95. 复合形法165.1 复合行法基本思想165.3 源程序代码及结果166. 外点惩罚函数法246.1解题思路:246.2 流程框图246.3 题目246.4 源程序代码及结果247.机械设计实际问题分析307.2计算过程如下307.3 源程序编写328.报告总结331.进退法确定初始区间1.1 进退法基本思路:按照一定的规则试算若干个点.比较其函数值的大小.直至找到函数值按高-低-高变化的单峰区间。1.2 进退法程序框图1.3 题目:用进退法求解函数的搜索区间1.4 源程序代码及运行结果#include #include mainfloat h,h0,y1,y2,y3,a1=0,a2,a3,fa2,fa3;scanf;h=h0;a2=h;y2=a2*a2-7*a2+10;if y1h=-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 y3goto loop;elseprintf;搜索区间为0 62.黄金分割法2.1黄金分割法基本思路:通过不断的缩短单峰区间的长度来搜索极小点的一种有效方法。按缩小比较大小确定取舍区间。2.2黄金分割法流程图2.3 题目:对函数.给定搜索区间时.试用黄金分割法求极小点2.4 源程序代码及结果:f=inlinea=0;b=8;eps=0.001;a1=b-0.618*;y1=f;a2=a+0.618*;y2=f;whileabsepsif=y2 a=a1; a1=a2; y1=y2; a2=a+0.618*; y2=f;else b=a2;a2=a1;y2=y1; a1=b-0.618*; y1=f;endendxxx=0.5*f = Inline function: f = x2-7*x+9xxx = 3.49973.牛顿型法3.1牛顿型法基本思路:在邻域内用一个二次函数来近似代替原目标函数.并将的极小点作为对目标函数求优的下一个迭代点。经多次迭代.使之逼近目标函数的极小点。3.2 阻尼牛顿法的流程图:3.3 题目:用牛顿阻尼法求函数的极小点3.4 源程序代码及结果:k=0; ptol=1.0e-5;xk=input itcl=1;1; while norm=ptol f1=4*xk3-24*xk2+50*xk-4*xk-32;-4*xk+8*xk; G=12*xk2-48*xk+50,-4;-4,8; dk=-inv*f1; a=-/; xk=xk+a*dk; itcl=a*dk; k=k+1; endf=xk-24+xk-2*xk2; fprintf; disp; disp; 结果显示:input x0:1;1用阻尼牛顿法迭代 27 次后得到 极小点 x*及极小值 f 为:2.0000 1.00001.3270e-0194.鲍威尔法4.1 鲍威尔法基本思路:在不用导数的前提下.在迭代中逐次构造G的共轭方向。4.2 鲍威尔法流程图:43 题目:求函数fx= x0*x0+x1*x1-x0*x1-10*x0-4*x1+60的最优点.收敛精度=0.0014.4 源程序代码及结果:#include stdio.h#include stdlib.h#include math.hdouble objfdouble ff;ff=x0*x0+x1*x1-x0*x1-10*x0-4*x1+60;return;void jtfint i;double *x3,h,f1,f2,f3;fori=0;ixi=mallocn*sizeof;h=h0;fori=0;i*=x0i;f1=objf;fori=0;i*=*+h*si;f2=objf;if=f1h=-h0;fori=0;i*=*;f3=f1;fori=0;i*=*;*=*;f1=f2;f2=f3;forh=2*h;fori=0;i*=*+h*si;f3=objf;iff2 break;else fori=0;i*=*;*=*;f1=f2;f2=f3;ifhfori=0;iai=*;bi=*;elsefori=0;iai=*;bi=*;fori=0;ifree;double goldint i;double f1,f2,*x2,ff,q,w;fori=0;ixi=mallocn*sizeof;fori=0;i*=ai+0.618*;*=ai+0.382*;f1=objf;f2=objf;doiff2fori=0;ibi=*;*=*;f1=f2;fori=0;i*=ai+0.382*;f2=objf;else fori=0;iai=*;*=*;f2=f1;fori=0;i*=ai+0.618*;f1=objf;q=0;fori=0;iq=q+*;w=sqrt;whileeps;fori=0;ixxi=0.5*;ff=objf;fori=0;ifree;return;double oneoptimdouble *a,*b,ff;a=mallocn*sizeof;b=mallocn*sizeof;jtf;ff=gold;free;free;return ;double powellint i,j,m;double *xx4,*ss,*s;double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;ss=mallocn*sizeof;s=mallocn*sizeof;fori=0;iforj=0;j*ss+i*+j=0;*ss+i*+i=1;fori=0;ixxi=mallocn*sizeof;fori=0;i*=pi;forfori=0;i*=*;xi=*;f0=f1=objf;dlt=-1;forj=0;jfori=0;i*=xi;*=*ss+i*+j;f=oneoptim;df=f0-f;ifdltdlt=df;m=j;sdx=0;fori=0;isdx=sdx+fabsxi-*;ifsdxfree;free;fori=0;ifree;return;fori=0;i*=xi;f2=f;fori=0;i*=2*-*;xi=*;fx=objf;f3=fx;q=*;d=0.5*dlt*;iff3|qiff2fori=0;i*=*;elsefori=0;i*=*;elsefori=0;i*ss+*=xi-*;*=*ss+*;f=oneoptim;fori=0;i*=xi;forj=m+1;jfori=0;i*ss+i*+j-1=*ss+i*+j;void maindouble p=1,2;double ff,x2;ff=powell;printf;getchar;5. 复合形法5.1 复合行法基本思想:在可行域中选取K个设计点n+1K2n作为初始复合形的顶点。比较各顶点目标函数值的大小.去掉目标函数值最大的顶点.以坏点以外其余各点的中心为映射中心.用坏点的映射点替换该点.构成新的复合形顶点。反复迭代计算.使复合形不断向最优点移动和收缩.直至收缩到复合形的顶点与形心非常接近.且满足迭代精度要求为止。5.2 题目:求函数f=*+4*的最优点.约束条件为g1=64-x1*x1-x2*x20;g2=x2-x1-100;g3=x1-100;收敛精度自定义;5.3 源程序代码及结果:#include #include #include #include #define E0 1e-5 /*复合形法收敛控制精度*/ double *apply; /*申请矩阵空间*/ double f; /*目标函数*/ double *g; /*约束函数*/ bool judge; /*可行点的判断*/ int main int n,k; int i,j,k1; int l; double temporary; double restrain; /*收敛条件*/ double reflect; /*反射系数*/ srandtime; printf; /*输入已知数据*/ scanf; printf; scanf; double *x=apply; /*存放复合形顶点*/ double *y=callock,sizeof; /*存放目标函数值*/ double *p=calloc3,sizeof; /*存放约束函数值*/ double *a=callocn,sizeof; /*存放设计变量的下限*/ double *b=callocn,sizeof; /*存放设计变量的上限*/ double *x_c=callocn,sizeof; /*存放可行点中心*/ double *x_r=callocn,sizeof; /*存放最坏点的反射点*/ printf请输入选定的第一个可行点 x1:,n; fori=0;i scanf; printf请输入初选变量的下限 a:,n; fori=0;i scanf; printf请输入初选变量的上限 b:,n; fori=0;i scanf; printf输出输入结果为:nn=%d,k=%d,x1=; /*输出已知数据*/ fori=0;i printf%.5lf ,*; printfna=,*;fori=0;i printf%f ,*; printf,b=,*; fori=0;i printf%f ,*; printfn,*; L1: fori=1;i /*随机得到其余个可行点*/forj=0;j *+j=*+rand%10000/10000*-*; l=1; fori=1;i /*找出可行点的个数 l.并把可行点放在前 l 个位置上*/ ifjudge* forj=1;j if!judge* fork1=0;k1 temporary=*+k1; *+k1=*+k1;*+k1=temporary; break; l+; fori=0;i /*把前 l 个可行点按目标函数值从大到小排序*/forj=i+1;jiff*f*fork1=0;k1 temporary=*+k1;*+k1=*+k1;*+k1=temporary; fori=0;i /*求可行点中心*/ *=0;fori=0;i forj=0;j *+=*+j;fori=0;i */=l;if!judge /*判断可行点中心是否可行*/ fori=0;i *=*+i;*=*; goto L1; else fori=l;i /*将不可行点可行化*/ doforj=0;j *+j=*+0.5*+j-*;while!judge*;L2:fori=0;i /*将可行点按目标函数值从大到小排序*/ forj=i+1;j iff*f* fork1=0;k1 temporary=*+k1;*+k1=*+k1; *+k1=temporary; restrain=0; /*求收敛条件*/ fori=0;irestrain+=f*-f*f*-f*;restrain=sqrt1.0/*restrain; ifrestrain /*判断收敛条件*/ printfn 求得约束最优点为:;fori=0;i printf%.5f ,*+i;printfn 目标函数的最优解为:%.5fn,f*; return 0; else L3:fori=0;i /*计算除去最坏点*x 外的个顶点的中心*/ *=0; fori=1;iforj=0;j*+=*+j; fori=0;i */=k-1;reflect=1.3; L4:fori=0;i /*求反射点*/ *=*+reflect*-*;if!judge reflect*=0.5;goto L4; else ifff fori=0;i *=*; goto L2; else ifreflect fori=0;i *=*+i;goto L3; else reflect*=0.5;goto L4; double *apply /*申请矩阵空间*/ int i; double *x=callocrow*col,sizeof; double *y=callocrow,sizeof; if printf; exit; fori=0;i *=x+i*col; return y; double f /*目标函数*/ return *+4*-6*-6; double *g /*约束函数*/ double *p=calloc3,sizeof; if printf; exit; *p=64-*-*; *=*-*x-10; *=*x-10; return p; bool judge /*可行点的判断*/ int i; double *p=calloc3,sizeof; p=g; fori=0;i if *0 break; if return true; else return false; 6. 外点惩罚函数法6.1解题思路:外点法是从可行域的外部构造一个点序列去逼近原约束问题的最优解。外点法可以用来求解含不等式和等式约束的优化问题。外点惩罚函数的形式为:6.2 流程框图:6.3 题目:求函数f=*+4*的最优点.约束条件:g1=64-x1*x1-x2*x20;g2=x2-x1-100;g3=x1-100;收敛精度=0.00001;6.4 源程序代码及结果:#include #include#includedouble lamta10=0, 1.0 ,0 ,0 ,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;/初值 double c=10;/递减系数double e=0.00001;/精度控制double r0=1;/初始惩罚因子double r=1;/函数声明部分void Powell; /鲍威尔方法函数double fxy; /待求函数double ysearch; /一维搜索的目标函数void search; /区间搜索double yellowcut; /黄金分割void sort;/选择法排序void main /约束优化方法主函数入口 cout请输入精度e;changyan:Powell; double cmpare4; int flag1=0; for int i=1;i cmparei=x_i-x0i; if fabs flag1+; if printf;/ cout最优解为:x1=x_1 x2=x_2 x3=x_3endl ; cout最小值为fxyendl; else for int j=1;j x0j=x_j; r=c*r; goto changyan; /子函数定义部分double fxy/待求函数 double m,n,p; m=0?:0; n=0?:0; p=0?:0; return /惩罚函数*+4*+r*+r*;void Powell /鲍威尔方法函数定义 double det=0.0001; /迭代精度 int k;my1: for k=1;k m=3*k-2; double a=0,b=0,xo=0; search; /完成区间搜索 double temp; temp=yellowcut;/黄金分割法 int n=3*k-2; for int i=1;i switch case 1:x1i=x0i+temp*lamtan+;break; case 2:x2i=x1i+temp*lamtan+;break; case 3:x3i=x2i+temp*lamtan+;break; default :break; double cmp4; int flag=0; for int i=1;i cmpi=x3i-x0i; if fabs flag+; if /找到最优解 x_1=x31; x_2=x32; x_3=x33; else double fy4; fy0=fxy; fy1=fxy; fy2=fxy; fy3=fxy; double fyy3; for int ii=0;ii fyyii=fyii-fyii+1; sort; for ii=1;ii x4ii=2*x3ii-x0ii; double f0,f3,f4; f0=fy0; f3=fy3; f4=fxy; if /2=fyy2 if f3 for int t=1;t x0t=x3t; else for int t=1;t x0t=x4t; goto my1; else for int t=0;t lamta1t=x3t+1-x0t+1; m=0; /switch 标志! double aa=0,bb=0; search; double temp1; temp1=yellowcut; for int i=1;ix5i=x3i+temp1*lamta1i-1; for i=1;i x0i=x5i; for i=1;i lamtai=lamtai+3; for i=1;i lamta6+i=lamta1i-1; goto my1;double ysearch /一维搜索的目标函数switch case 1: return fxy;break;case 4: return fxy;break;case 7: return fxy;break;case 0: return fxy;break;/更改方向后的一维搜索default:return 0; break;void search /区间搜索double a1,a2,a3,y1,y2,y3;h=1;a1=a,y1=ysearch;a2=a+h,y2=ysearch;if=y1 h=-h,a3=a1,y3=y1; a1=a2,y1=y2,a2=a3,y2=y3;a3=a2+h,y3=ysearch;whiley3 h=2*h; a1=a2,y1=y2,a2=a3,y2=y3; a3=a2+h,y3=ysearch;ifha=a3,b=a1;else a=a1,b=a3;double yellowcut double e; /黄金分割法求解 e=0.001; double c,fc; c=a+0.382*; fc=ysearch; double d,fd; double xo; d=a+0.618*; fd=ysearch;label2: if fc b=d; d=c; fd=fc; c=a+0.382*; fc=ysearch; else a=c; c=d; fc=fd; d=a+0.618*; fd=ysearch; if xo=/2; else goto label2; return xo;void sort/选择法排序 int i,j; double k; fori=0;i forj=i+1;j if*k=*;*=*;*=k;7.机械设计实际问题分析 7.1题目:图示为一对称的两杆支架.在支架的顶点承受一个载荷为2F=300000.支架之间的水平距离 2B=1520mm.若已选定壁厚T=2.5mm钢管.密度p=8300kg/m3.屈服点 .材料的弹性模量。要求在满足强度与稳定性条件下设计最轻的支架尺寸。7.2计算过程如下:解:计算压杆的临界柔度为:.由于支架为空心杆.失效形式主要为屈服.故计算稳定性用屈服极限公式。根据题意可得方程组: , 代入整理得到内点混合惩罚函数法的标准形式为:构建惩罚函数:.取.解得:令迭代精度为:.由于函数是X的2次方程.故不必判别函数值的相对变化量。7.3 源程序编写#include #include double GetX3 return 1-42*sqrt*0.21*sqrt+0.01*r/168.172*sqrt-38*r+0.0025;double GetX4return 0.21*sqrt+0.01*r/168.172*sqrt-38*r; double F return 42.4315*;maindoublex1=0,x2=0,x3,x4,r=1,c=0.01,m=0.0000001; int i=1; x3=GetX3; x4=GetX4; while printf; printf; printf; printf; printf; r=c*r;x1=x3; x2=x4; x3=GetX3; x4=GetX4;iffabs&fabs break; i+; printf; printfR=%fn,x3; printfr=%fn,x4; printf最小体积V=%fn,F; return;用C语言编程计算.求得结果为:最小外径R=3.749mm.最小内径r=1.249mm.最小体积:v=530000立方毫米故满足强度与稳定性条件下最轻的支架尺寸约为外径3.75mm.内径1.25mm。8.报告总结通过这一段时间的学习我了解到机械优化设计是以数学规划论为基础.以计算机为工具.一种自动寻优的先进的、现代的设计方法。根据设计所追求的性能目标.建立目标函数.在满足给定的各种约束条件下.寻求最优的设计方案。可见它是非常经典的一门学科。再加上王卫荣老师系统全面科学的教授过程.更是使这一学科魅力十足.强烈地吸引着我对它的深入学习和实践。在课程学习过程中我明白了很多工程问题是可以转化为数学模型并可以通过计算机求解。同时了解了delphi的基本的使用技巧.并且复习了C语言和matlab编程相关知识.并将其应用到了约束随机法、惩罚函数法去求解问题.收获颇多。优化设计同时也教会了我如何追求优.同时使自己有能力、有办法化到优!26 / 26
展开阅读全文