机械优化设计实验报告(浙江理工大学)_第1页
机械优化设计实验报告(浙江理工大学)_第2页
机械优化设计实验报告(浙江理工大学)_第3页
机械优化设计实验报告(浙江理工大学)_第4页
机械优化设计实验报告(浙江理工大学)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上机械优化设计实验报告班级:XXXX姓名:XX 学号:XXXXXXXXXXX一、 外推法1、 实验原理常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。一般情况下,我们并不知道一元函数f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。该区间越小越好,并且仅存在唯一极小值点。所确定的单股区间应具有如下性质:如果在1,3区间内任取一点2,,1<2<3或3<2<1

2、,则必有f(1)>f(2)<f(3)。由此可知,单股区间有一个共同特点:函数值的变化规律呈现“大-小-大”或“高-低-高”的趋势,在极小值点的左侧,函数值呈严格下降趋势,在极小值点右侧,函数值呈严格上升趋势,这正是单股区间依据。2、 实验工具C-Free3.5软件3、 程序调试#include<stdio.h>#include<math.h>#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”,&a

3、mp;a0);printf(“h=”,h); /起始的步长scanf(“%lf”,&h);a1=a0;a2=a1+h;f1=f(a0);f2=f(a2);if(f1>f2) /判断函数值的大小,确定下降方向 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);pri

4、ntf(“a1=%lf,a3=%lfn”,a1,a3);printf(“a1,a3=%lf,%lfn”,a1,a3); /输出区间4、 调试结果5、 总结与讨论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)f2<f4:此时必有极小值点1,4,应舍去区间4,3,保留的区间长度为l,缩小后的新区间为1,4;(2)f

5、2>f4:此时必有极小值点2,3,应舍去区间1,2,保留的区间长度为l,缩小后的新区间为2,3;(3)f2=f4:此时必有极小值点2,4,应舍去区间1,2或4,3。经过比较取舍后,缩小后所得的新区建长度均为l,将区间端点重新命名为1,3,就可以进行新一轮的比较,如此循环。2、 实验工具C-Free 3.5软件3、 程序调试#include<stdio.h>#include<math.h>#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,

6、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(f2>f4) /判断函数值大小,缩小比较区间 a1=a2;

7、 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="); scanf("%

8、f",&a1); puts("单谷区间 a3="); scanf("%f",&a3); puts("收敛精度 b="); scanf("%.4f",b);语句时,注意在最后一个scanf语句约束输入的位数,如在前面输入约束,puts("单谷区间 a1="); scanf("%.4f",&a1); puts("单谷区间 a3="); scanf("%.4f",&a3); puts("收敛

9、精度 b="); scanf("%.4f",b);如会出现程序如下错误:如不输入约束,函数由于float的精度位数太高,会陷入死循环,导致程序崩溃。如图所示:三、 鲍威尔法1、 实验原理鲍威尔法多维无约束优化算法 是在无约束优化算法之一,首先选取一组共轭方向,从某个初始点出发,求目标函数在这些方向上的极小值点,然后以该点为新的出发点,重复这一过程直到获得满意解,其优点是不必计算目标函数的梯度就可以在有限步内找到极值点。 鲍威尔法是以共轭方向为基础的收敛较快的直接法之一,是一种十分有效的算法。在无约束方法中许多算法都是以共轭方向作为搜索方向,它们具有许多特点。根据构

10、造共轭方向的原理不同,可以形成不同的共轭方向法。2、 实验工具C-Free 3.5 软件3、 程序调试#include <stdio.h>#include <stdlib.h>#include <math.h>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

11、 *x3,h,f1,f2,f3; for (i=0;i<3;i+) xi=(double *)malloc(n*sizeof(double); h=h0; for(i=0;i<n;i+)*(x0+i)=x0i; f1=objf(x0); for(i=0;i<n;i+)*(x1+i)=*(x0+i)+h*si; f2=objf(x1); if(f2>=f1) h= -h0; for (i=0;i<n;i+)*(x2+i)=*(x0+i); f3=f1; for(i=0;i<n;i+) *(x0+i)= *(x1+i);*(x1+i)= *(x2+i); f1=

12、f2; f2=f3;for(;)h=2. *h;for(i=0;i<n;i+) *(x2+i)=* (x1+i) +h*si;f3= objf(x2);if(f2<f3) break;else for(i=0;i<n;i+) *(x0+i)= *(x1+i);*(x1+i)= *(x2+i); f1=f2; f2=f3; if(h<0. )for(i=0;i<n;i+) ai=*(x2+i); bi=*(x0+i); else for(i=0;i<n;i+) ai=*(x0+i); bi=*(x2+i); for(i=0;i<3;i+) free(xi

13、);double gold(double a,double b,double eps,int n,double xx)int i;double f1,f2,*x2,ff,q,w;for(i=0;i<2;i+)xi=(double*)malloc (n*sizeof(double);for(i=0;i<n;i+)*(x0+i)=ai+0.618*(bi-ai);*(x1+i)=ai+0.382*(bi-ai);f1=objf(x0);f2=objf(x1);doif(f1>f2)for(i=0;i<n;i+)bi=*(x0+i);*(x0+i)=*(x1+i);f1=f2

14、;for(i=0;i<n;i+)*(x1+i)=ai+0.382*(bi-ai);f2=objf(x1);elsefor(i=0;i<n;i+)ai=*(x1+i);*(x1+i)=*(x0+i);f2=f1;for(i=0;i<n;i+)*(x0+i)=ai+0.618*(bi-ai);f1=objf(x0);q=0;for(i=0;i<n;i+)q=q+(bi-ai)*(bi-ai);w=sqrt(q);while(w>eps);for(i=0;i<n;i+)xxi=0.5*(ai+bi);ff=objf(xx);for(i=0;i<2;i+)fr

15、ee(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=(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);double powell(double p,double h0,double eps,do

16、uble 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 *)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+) xxi=(double *)malloc(n*

17、sizeof(double); for (i=0;i<n;i+) *(xx0+i)=pi; for(;) for (i=0;i<n;i+) *(xx1+i)=*(xx0+i); xi=*(xx1+i); f0=f1=objf(x); dlt=-1; for (j=0;j<n;j+) for (i=0;i<n;i+) *(xx0+i)=xi; *(s+i)=*(ss+i*(n+1)+j); f=oneoptim(xx0,s,h0,epsg,n,x); df=f0-f; if(df>dlt) dlt=df; m=j; sdx=0.; for (i=0;i<n;i

18、+) sdx=sdx+fabs(xi-(*(xx1+i); if(sdx<eps) free(ss); free(s); for (i=0;i<4;i+) free(xxi); return(f); for (i=0;i<n;i+) *(xx2+i)=xi; f2=f; for (i=0;i<n;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(

19、f3<f1)|(q<d) if(f2<=f3) for (i=0;i<n;i+) *(xx0+i)=*(xx2+i); else for (i=0;i<n;i+) *(xx0+i)=*(xx3+i); else for (i=0;i<n;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;i<n;i+) *(xx0+i)=xi; for (j=m+1;j<=n;j+) for (i=0;i<n;i

20、+) *(ss+i*(n+1)+j-1)=*(ss+i*(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) 有程序框图可得鲍威尔法的基本算法结构如下:dodo循环体While(判别式);If(判别式) 表达式1elseif(判别式) 表达式2else 语句while(判别式);机械优化设计问题1、 问题描述现有一单级渐开线直齿圆柱齿轮

温馨提示

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

评论

0/150

提交评论