1、机械优化设计实验报告班级:XXXX姓名:XX学号:XXXXXXXXXXX一、 外推法1、 实验原理常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。一般情况下,我们并不知道一元函数 f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。该区间越小越好,并且仅存在唯一极小值点。所确定的单股区间应具有如下性质:如果在1,3区间内任取一点2,,1f(2)#include#define f(x) 3*x*x-8*x+
2、9 /定义函数int main()double a0,a1,a2,a3,f1,f2,f3,h;printf(“a0=”,a0); /单谷区间起始点scanf(“%lf”,printf(“h=”,h); /起始的步长scanf(“%lf”,a1=a0;a2=a1+h;f1=f(a0);f2=f(a2);if(f1f2) /判断函数值的大小,确定下降方向a3=a2+h;f3=f(a3);elseh=-h;a3=a1;f3=f1;a1=a2;f1=f2;a2=a3;f2=f3;a3=a2+h;f3=f(a3);while(f3f4:此时必有极小值点 ,应舍去区间1,2 ,保留的区间长度为2,3l,缩
3、小后的新区间为 2,3;(3 ) f2=f4:此时必有极小值点 ,应舍去区间1,2 或4,3。2,4经过比较取舍后,缩小后所得的新区建长度均为 l,将区间端点重新命名为 1,3,就可以进行新一轮的比较,如此循环。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“,puts(“单谷区间 a3=“);scan
4、f(“%f“,puts(“收敛精度 b=“);scanf(“%.4f“,b);a2=a3-v*(a3-a1);f2=f(a2);a4=a1+v*(a3-a1);f4=f(a4);do /do-while 循环,知道满足条件退出循环if(f2f4) /判断函数值大小,缩小比较区间a1=a2;a2=a4;f2=f4;a4=a1+v*(a3-a1);f4=f(a4);elsea3=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); /输出结果pri
5、ntf(“f0=%lfn“,f0);4、 调试结果5、 总结与讨论1) 要选择合适的循环嵌套语句,实现循环的同时判断;2) 在执行puts(“单谷区间 a1=“);scanf(“%f“,puts(“单谷区间 a3=“);scanf(“%f“,puts(“收敛精度 b=“);scanf(“%.4f“,b);语句时,注意在最后一个 scanf 语句约束输入的位数,如在前面输入约束,puts(“单谷区间 a1=“);scanf(“%.4f“,puts(“单谷区间 a3=“);scanf(“%.4f“,puts(“收敛精度 b=“);scanf(“%.4f“,b);如会出现程序如下错误:如不输入约束,
6、函数由于 float 的精度位数太高,会陷入死循环,导致程序崩溃。如图所示:三、 鲍威尔法1、 实验原理鲍威尔法多维无约束优化算法 是在无约束优化算法之一,首先选取一组共轭方向,从某个初始点出发,求目标函数在这些方向上的极小值点,然后以该点为新的出发点,重复这一过程直到获得满意解,其优点是不必计算目标函数的梯度就可以在有限步内找到极值点。 鲍威尔法是以共轭方向为基础的收敛较快的直接法之一,是一种十分有效的算法。在无约束方法中许多算法都是以共轭方向作为搜索方向,它们具有许多特点。根据构造共轭方向的原理不同,可以形成不同的共轭方向法。2、 实验工具C-Free 3.5 软件3、 程序调试#incl
7、ude #include #include double objf(double x)/定义目标函数double ff;ff=10*(x0+x1-5)*(x0+x1-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;i=f1)h= -h0;for (i=0;if2)for(i=0;ieps);for(i=0;idlt)dlt=df;m=j;sdx=0.;for (i=
8、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-f3);if(f3f1)|(qd)if(f2=f3)for (i=0;
9、in;i+)*(xx0+i)=*(xx2+i);elsefor (i=0;in;i+)*(xx0+i)=*(xx3+i);elsefor (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*(n+1)+j);int main() /主函数double p=1,1;double ff,x2;ff
10、=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) 有程序框图可得鲍威尔法的基本算法结构如下:dodo循环体While(判别式);If(判别式) 表达式 1elseif(判别式)
11、表达式 2else 语句while(判别式);机械优化设计问题1、 问题描述现有一单级渐开线直齿圆柱齿轮减速器,其输入功率 N=280kW,输入转矩n1=980r/min,传动比 i=5。小齿轮为实体结构,大齿轮为腹板式结构(带有四个减轻孔) ,两齿轮各部分尺寸的符号如图所示:原用常规设计方法的设计结果为:齿宽 B=B2=13cm,小齿轮齿数 z1=21,模数m0.8cm,l1=42cm,d s1=12cm,ds2=16cm。先要求在保证承载能力的条件下,通过优选上述有关参数,使减速器的体积达到最小。2、 建立目标函数减速器的体积主要取决于内部零件的尺寸大小,在齿轮和轴的结构尺寸确定之后,箱体
12、的尺寸将随之确定,因此将齿轮和轴的总体积达到最小作为优化目标。减速器内部有两个齿轮和两根轴,为了简化计算,将轴视为光轴,则有=1+2+1+2=421(1+2)+422(1+2)+4(2121)+4(2222)4(2221)(2)4(420)式中: 两轴体积,cm 3;1, 2两齿轮体积,cm 3;1, 2两轴的直径, cm;1, 2轴的长度, cm;1, 2, 3两齿轮的分度圆直径,cm;1, 2m两齿轮的模数;B1,B 2两齿轮的宽度,近似取 B1=B2=B,cm;优化设计中的设计变量取为:=1,2,3,4,5,6=,1,1,1,2将目标函数整理后得到:() =0.78539815(4.7512223+851222385123+0.92126125+0.812341.6163+425+426+2825+3226)