《机械优化设计实验报告(浙江理工大学)(共19页).docx》由会员分享,可在线阅读,更多相关《机械优化设计实验报告(浙江理工大学)(共19页).docx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上机械优化设计实验报告班级:XXXX姓名:XX 学号:XXXXXXXXXXX一、 外推法1、 实验原理常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。一般情况下,我们并不知道一元函数f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。该区间越小越好,并且仅存在唯一极小值点。所确定的单股区间应具有如下性质:如果在1,3区间内任取一点2,,123或32f(2)f(3)。由此可知,单股区
2、间有一个共同特点:函数值的变化规律呈现“大-小-大”或“高-低-高”的趋势,在极小值点的左侧,函数值呈严格下降趋势,在极小值点右侧,函数值呈严格上升趋势,这正是单股区间依据。2、 实验工具C-Free3.5软件3、 程序调试#include#include#define f(x) 3*x*x-8*x+9 /定义函数int main()double a0,a1,a2,a3,f1,f2,f3,h;printf(“a0=”,a0); /单谷区间起始点scanf(“%lf”,&a0);printf(“h=”,h); /起始的步长scanf(“%lf”,&h);a1=a0;a2=a1+h;f1=f(a0
3、);f2=f(a2);if(f1f2) /判断函数值的大小,确定下降方向 a3=a2+h; f3=f(a3);else h=-h; a3=a1; f3=f1; a1=a2; f1=f2; a2=a3; f2=f3; a3=a2+h; f3=f(a3);while(f3=f2) /当不满足上述比较时,说明下降方向反向,继续进行判断 h=2*h; a1=a2; f1=f2; a2=a3; f2=f3; a3=a2+h; f3=f(a3);printf(“a1=%lf,a3=%lfn”,a1,a3);printf(“a1,a3=%lf,%lfn”,a1,a3); /输出区间4、 调试结果5、 总结与
4、讨论1) 当写成void main时会出现如下警告改成int main警告消失。二、 黄金分割法1、 实验原理在外推法确定了单股区间1,3的基础上去其中对称两点2,4,且满足2=3-3-14=1+(3-1)式中,位01的缩小系数。计算点2,4的函数值,记f2=f(2),f4=f(4),并比较他们的大小,可能存在如下三种情况:(1)f2f4:此时必有极小值点2,3,应舍去区间1,2,保留的区间长度为l,缩小后的新区间为2,3;(3)f2=f4:此时必有极小值点2,4,应舍去区间1,2或4,3。经过比较取舍后,缩小后所得的新区建长度均为l,将区间端点重新命名为1,3,就可以进行新一轮的比较,如此循
5、环。2、 实验工具C-Free 3.5软件3、 程序调试#include#include#define f(x) 3*x*x-8*x+9#define v 0.618 /黄金分割点int main() float a0,a1,a2,a3,a4,f0,f1,f2,f3,f4,b; /b收敛精度 puts(单谷区间 a1=); scanf(%f,&a1); puts(单谷区间 a3=); scanf(%f,&a3); puts(收敛精度 b=); scanf(%.4f,b); a2=a3-v*(a3-a1); f2=f(a2); a4=a1+v*(a3-a1); f4=f(a4); do /do-
6、while循环,知道满足条件退出循环 if(f2f4) /判断函数值大小,缩小比较区间 a1=a2; a2=a4; f2=f4; a4=a1+v*(a3-a1); f4=f(a4); else a3=a4; a4=a2; f4=f2; a2=a3-v*(a3-a1); f2=f(a2); while(abs(a3-a1)b); a0=(a3+a1)/2; f0=f(a0); printf(a0=%lfn,a0); /输出结果 printf(f0=%lfn,f0);4、 调试结果5、 总结与讨论1) 要选择合适的循环嵌套语句,实现循环的同时判断;2) 在执行puts(单谷区间 a1=); sca
7、nf(%f,&a1); puts(单谷区间 a3=); scanf(%f,&a3); puts(收敛精度 b=); scanf(%.4f,b);语句时,注意在最后一个scanf语句约束输入的位数,如在前面输入约束,puts(单谷区间 a1=); scanf(%.4f,&a1); puts(单谷区间 a3=); scanf(%.4f,&a3); puts(收敛精度 b=); scanf(%.4f,b);如会出现程序如下错误:如不输入约束,函数由于float的精度位数太高,会陷入死循环,导致程序崩溃。如图所示:三、 鲍威尔法1、 实验原理鲍威尔法多维无约束优化算法 是在无约束优化算法之一,首先选取
8、一组共轭方向,从某个初始点出发,求目标函数在这些方向上的极小值点,然后以该点为新的出发点,重复这一过程直到获得满意解,其优点是不必计算目标函数的梯度就可以在有限步内找到极值点。 鲍威尔法是以共轭方向为基础的收敛较快的直接法之一,是一种十分有效的算法。在无约束方法中许多算法都是以共轭方向作为搜索方向,它们具有许多特点。根据构造共轭方向的原理不同,可以形成不同的共轭方向法。2、 实验工具C-Free 3.5 软件3、 程序调试#include #include #include double objf(double x)/定义目标函数double ff;ff=10*(x0+x1-5)*(x0+x1
9、-5)+(x0-x1)*(x0-x1);return(ff); /返回函数值void jtf(double x0 ,double h0,double s ,int 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;in;i+)*(x0+i)=x0i; f1=objf(x0); for(i=0;i=f1) h= -h0; for (i=0;in;i+)*(x2+i)=*(x0+i); f3=f1; for(i
10、=0;in;i+) *(x0+i)= *(x1+i);*(x1+i)= *(x2+i); f1=f2; f2=f3;for(;)h=2. *h;for(i=0;in;i+) *(x2+i)=* (x1+i) +h*si;f3= objf(x2);if(f2f3) break;else for(i=0;in;i+) *(x0+i)= *(x1+i);*(x1+i)= *(x2+i); f1=f2; f2=f3; if(h0. )for(i=0;in;i+) ai=*(x2+i); bi=*(x0+i); else for(i=0;in;i+) ai=*(x0+i); bi=*(x2+i); fo
11、r(i=0;i3;i+) free(xi);double gold(double a,double b,double eps,int 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;if2)for(i=0;in;i+)bi=*(x0+i);*(x0+i)=*(x1+i);f1=f2;for(i=0;in;i+)*(x1+i)=ai+0.382*(bi-ai);f2=objf(x1);elsefor(i=0;in;i+)ai=*(x1+i);*
12、(x1+i)=*(x0+i);f2=f1;for(i=0;in;i+)*(x0+i)=ai+0.618*(bi-ai);f1=objf(x0);q=0;for(i=0;ieps);for(i=0;in;i+)xxi=0.5*(ai+bi);ff=objf(xx);for(i=0;i2;i+)free(xi);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=(doub
13、le *)malloc(n*sizeof(double); jtf(x0,h0,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,int 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 *
14、)malloc(n*sizeof(double); for (i=0;in;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;in;i+) *(xx0+i)=pi; for(;) for (i=0;in;i+) *(xx1+i)=*(xx0+i); xi=*(xx1+i); f0=f1=objf(x); dlt=-1; for (j=0;jn;j+) for (i=0;idlt) dlt=df; m=
15、j; sdx=0.; for (i=0;in;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;in;i+) *(xx2+i)=xi; f2=f; for (i=0;in;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*(f1-f3)*(f1-
16、f3); if(f3f1)|(qd) if(f2=f3) for (i=0;in;i+) *(xx0+i)=*(xx2+i); else for (i=0;in;i+) *(xx0+i)=*(xx3+i); else for (i=0;in;i+) *(ss+(i+1)*(n+1)=xi-(*(xx1+i); *(s+i)=*(ss+(i+1)*(n+1); f=oneoptim(xx0,s,h0,epsg,n,x); for(i=0;in;i+) *(xx0+i)=xi; for (j=m+1;j=n;j+) for (i=0;in;i+) *(ss+i*(n+1)+j-1)=*(ss+i*
17、(n+1)+j); int main() /主函数 double p=1,1; double ff,x2; ff=powell(p,0.3,0.001,0.0001,2,x); printf(输出最优点及其目标函数值:n); printf(x0=%.4f,x1=%.4f,ff=%.4fn,x0,x1,ff);4、 调试结果5、 总结与讨论1) 鲍威尔法用C语言来编写存在很大的难度,由于C语言没有专属的矩阵运算和求导运算算法,所以又给编写鲍威尔法增加了很大难度,需要先定义矩阵的运算函数和求导的运算函数。因此,鲍威尔法编写的难点集中在了函数的编写,其主函数并不难。2) 有程序框图可得鲍威尔法的基本
18、算法结构如下:dodo循环体While(判别式);If(判别式) 表达式1elseif(判别式) 表达式2else 语句while(判别式);机械优化设计问题1、 问题描述现有一单级渐开线直齿圆柱齿轮减速器,其输入功率N=280kW,输入转矩n1=980r/min,传动比i=5。小齿轮为实体结构,大齿轮为腹板式结构(带有四个减轻孔),两齿轮各部分尺寸的符号如图所示:原用常规设计方法的设计结果为:齿宽B=B2=13cm,小齿轮齿数z1=21,模数m0.8cm,l1=42cm,ds1=12cm,ds2=16cm。先要求在保证承载能力的条件下,通过优选上述有关参数,使减速器的体积达到最小。2、 建立
19、目标函数减速器的体积主要取决于内部零件的尺寸大小,在齿轮和轴的结构尺寸确定之后,箱体的尺寸将随之确定,因此将齿轮和轴的总体积达到最小作为优化目标。减速器内部有两个齿轮和两根轴,为了简化计算,将轴视为光轴,则有V=VS1+VS2+Vg1+Vg2 =4ds12l1+l2+4ds22l1+l2+4d12-ds12+4d22-ds22-4D22-D12B2-C-4(4d02C)式中:VS1,VS2两轴体积,cm3; Vg1,Vg2两齿轮体积,cm3; ds1,ds2两轴的直径,cm; l1,l2,l3轴的长度,cm; d1,d2两齿轮的分度圆直径,cm; m两齿轮的模数; B1,B2两齿轮的宽度,近似取B1=B2=B,cm;优化设计中的设计变量取为:X=x1,x2,x3,x4,x5,x6T=B,z1,m,l1,ds1,ds2T将目标函数整理后得到:fX=0.(4.75x1x22x32+85x1x22x32-85x1x32+0.92x1x62-x1x52+0.8x1x2x3x4-1.6x1x6x3+x4x52+x4x62+28x52+32x62)专心-专注-专业