您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 机械优化设计实验报告(浙江理工大学)
机械优化设计实验报告班级:XXXX姓名:XX学号:XXXXXXXXXXX一、外推法1、实验原理常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。一般情况下,我们并不知道一元函数f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。该区间越小越好,并且仅存在唯一极小值点。所确定的单股区间应具有如下性质:如果在[α1,α3]区间内任取一点α2,,α1α2α3或α3α2α1,则必有f(α1)f(α2)f(α3)。由此可知,单股区间有一个共同特点:函数值的变化规律呈现“大---小---大”或“高---低---高”的趋势,在极小值点的左侧,函数值呈严格下降趋势,在极小值点右侧,函数值呈严格上升趋势,这正是单股区间依据。2、实验工具C-Free3.5软件3、程序调试#includestdio.h#includemath.h#definef(x)3*x*x-8*x+9//定义函数intmain(){doublea0,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);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=%lf\n”,a1,a3);printf(“[a1,a3]=[%lf,%lf]\n”,a1,a3);//输出区间}4、调试结果5、总结与讨论1)当写成voidmain时会出现如下警告改成intmain警告消失。二、黄金分割法1、实验原理在外推法确定了单股区间[α1,α3]的基础上去其中对称两点α2,α4,且满足α2=α3−λ(α3−α1)α4=α1+λ(α3−α1)式中,λ位0~1的缩小系数。计算点α2,α4的函数值,记f2=f(α2),f4=f(α4),并比较他们的大小,可能存在如下三种情况:(1)f2f4:此时必有极小值点α∈[α1,α4],应舍去区间[α4,α3],保留的区间长度为λl,缩小后的新区间为[α1,α4];(2)f2f4:此时必有极小值点α∈[α2,α3],应舍去区间[α1,α2],保留的区间长度为λl,缩小后的新区间为[α2,α3];(3)f2=f4:此时必有极小值点α∈[α2,α4],应舍去区间[α1,α2]或[α4,α3]。经过比较取舍后,缩小后所得的新区建长度均为λl,将区间端点重新命名为[α1,α3],就可以进行新一轮的比较,如此循环。2、实验工具C-Free3.5软件3、程序调试#includestdio.h#includemath.h#definef(x)3*x*x-8*x+9#definev0.618//黄金分割点intmain(){floata0,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-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=%lf\n,a0);//输出结果printf(f0=%lf\n,f0);}4、调试结果5、总结与讨论1)要选择合适的循环嵌套语句,实现循环的同时判断;2)在执行puts(单谷区间a1=);scanf(%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、实验原理鲍威尔法——多维无约束优化算法是在无约束优化算法之一,首先选取一组共轭方向,从某个初始点出发,求目标函数在这些方向上的极小值点,然后以该点为新的出发点,重复这一过程直到获得满意解,其优点是不必计算目标函数的梯度就可以在有限步内找到极值点。鲍威尔法是以共轭方向为基础的收敛较快的直接法之一,是一种十分有效的算法。在无约束方法中许多算法都是以共轭方向作为搜索方向,它们具有许多特点。根据构造共轭方向的原理不同,可以形成不同的共轭方向法。2、实验工具C-Free3.5软件3、程序调试#includestdio.h#includestdlib.h#includemath.hdoubleobjf(doublex[])//定义目标函数{doubleff;ff=10*(x[0]+x[1]-5)*(x[0]+x[1]-5)+(x[0]-x[1])*(x[0]-x[1]);return(ff);//返回函数值}voidjtf(doublex0[],doubleh0,doubles[],intn,doublea[],doubleb[]){inti;double*x[3],h,f1,f2,f3;for(i=0;i3;i++)x[i]=(double*)malloc(n*sizeof(double));h=h0;for(i=0;in;i++)*(x[0]+i)=x0[i];f1=objf(x[0]);for(i=0;in;i++)*(x[1]+i)=*(x[0]+i)+h*s[i];f2=objf(x[1]);if(f2=f1){h=-h0;for(i=0;in;i++)*(x[2]+i)=*(x[0]+i);f3=f1;for(i=0;in;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}for(;;){h=2.*h;for(i=0;in;i++)*(x[2]+i)=*(x[1]+i)+h*s[i];f3=objf(x[2]);if(f2f3)break;else{for(i=0;in;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}}if(h0.)for(i=0;in;i++){a[i]=*(x[2]+i);b[i]=*(x[0]+i);}elsefor(i=0;in;i++){a[i]=*(x[0]+i);b[i]=*(x[2]+i);}for(i=0;i3;i++)free(x[i]);}doublegold(doublea[],doubleb[],doubleeps,intn,doublexx[]){inti;doublef1,f2,*x[2],ff,q,w;for(i=0;i2;i++)x[i]=(double*)malloc(n*sizeof(double));for(i=0;in;i++){*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);}f1=objf(x[0]);f2=objf(x[1]);do{if(f1f2){for(i=0;in;i++){b[i]=*(x[0]+i);*(x[0]+i)=*(x[1]+i);}f1=f2;for(i=0;in;i++)*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);f2=objf(x[1]);}else{for(i=0;in;i++){a[i]=*(x[1]+i);*(x[1]+i)=*(x[0]+i);}f2=f1;for(i=0;in;i++)*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);f1=objf(x[0]);}q=0;for(i=0;in;i++)q=q+(b[i]-a[i])*(b[i]-a[i]);w=sqrt(q);}while(weps);for(i=0;in;i++)xx[i]=0.5*(a[i]+b[i]);ff=objf(xx);for(i=0;i2;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;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++)xx[i]=(double*)malloc(n*sizeof(double));for(i=0;in;i++)*(xx[0]+i)=p[i];for(;;){for(i=0;in;i++){*(xx[1]+i)=*(xx[0]+i);x[i]=*(xx[1]+i);}f0=f1=objf(x);dlt=-1;for(j=0;jn;j++){for(i=0;in;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(dfdlt){dlt=df;m=j;}}sdx=0.;for(i=0;in;i++)sdx=sdx+fabs(x[i]-(*(xx[1]+i)));if(sdxeps){free(ss);free(s);for(i=0;i4;i++)free(xx[i]);return(f);}for(i=0;in;i++)*(xx[2]+i)=x[i];f2=f;for(i=0;in;i++){*(xx[3]+i)=2.*(*(xx[2]+i)-(*(xx[1]+i)));x[
本文标题:机械优化设计实验报告(浙江理工大学)
链接地址:https://www.777doc.com/doc-4481318 .html