机械优化设计实验报告_第1页
机械优化设计实验报告_第2页
机械优化设计实验报告_第3页
机械优化设计实验报告_第4页
机械优化设计实验报告_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、机械优化设计实验报告 目录 TOC o 1-3 h z u HYPERLINK l _Toc328607018 1.进退法确定初始区间 PAGEREF _Toc328607018 h 3 HYPERLINK l _Toc328607019 1.1 进退法基本思路 PAGEREF _Toc328607019 h 3 HYPERLINK l _Toc328607020 1.2 进退法程序框图 PAGEREF _Toc328607020 h 3 HYPERLINK l _Toc328607021 1.3 题目 PAGEREF _Toc328607021 h 4 HYPERLINK l _Toc328

2、607022 1.4 源程序代码及运行结果 PAGEREF _Toc328607022 h 4 HYPERLINK l _Toc328607023 2.黄金分割法 PAGEREF _Toc328607023 h 5 HYPERLINK l _Toc328607024 2.2黄金分割法流程图 PAGEREF _Toc328607024 h 5 HYPERLINK l _Toc328607025 2.3 题目 PAGEREF _Toc328607025 h 5 HYPERLINK l _Toc328607026 2.4 源程序代码及结果 PAGEREF _Toc328607026 h 5 HYPE

3、RLINK l _Toc328607027 3.牛顿型法 PAGEREF _Toc328607027 h 6 HYPERLINK l _Toc328607028 3.1牛顿型法基本思路 PAGEREF _Toc328607028 h 6 HYPERLINK l _Toc328607029 3.2 阻尼牛顿法的流程图 PAGEREF _Toc328607029 h 6 HYPERLINK l _Toc328607030 3.3 题目 PAGEREF _Toc328607030 h 7 HYPERLINK l _Toc328607031 3.4 源程序代码及结果 PAGEREF _Toc32860

4、7031 h 7 HYPERLINK l _Toc328607032 4.鲍威尔法 PAGEREF _Toc328607032 h 8 HYPERLINK l _Toc328607033 4.1 鲍威尔法基本思路 PAGEREF _Toc328607033 h 8 HYPERLINK l _Toc328607034 4.2 鲍威尔法流程图 PAGEREF _Toc328607034 h 8 HYPERLINK l _Toc328607035 43 题目 PAGEREF _Toc328607035 h 9 HYPERLINK l _Toc328607036 4.4 源程序代码及结果 PAGERE

5、F _Toc328607036 h 9 HYPERLINK l _Toc328607037 5. 复合形法 PAGEREF _Toc328607037 h 16 HYPERLINK l _Toc328607038 5.1 复合行法基本思想 PAGEREF _Toc328607038 h 16 HYPERLINK l _Toc328607039 5.3 源程序代码及结果 PAGEREF _Toc328607039 h 16 HYPERLINK l _Toc328607040 6. 外点惩罚函数法 PAGEREF _Toc328607040 h 24 HYPERLINK l _Toc3286070

6、41 6.1解题思路: PAGEREF _Toc328607041 h 24 HYPERLINK l _Toc328607042 6.2 流程框图 PAGEREF _Toc328607042 h 24 HYPERLINK l _Toc328607043 6.3 题目 PAGEREF _Toc328607043 h 24 HYPERLINK l _Toc328607044 6.4 源程序代码及结果 PAGEREF _Toc328607044 h 24 HYPERLINK l _Toc328607045 7.机械设计实际问题分析 PAGEREF _Toc328607045 h 30 HYPERLI

7、NK l _Toc328607046 7.2计算过程如下 PAGEREF _Toc328607046 h 30 HYPERLINK l _Toc328607047 7.3 源程序编写 PAGEREF _Toc328607047 h 32 HYPERLINK l _Toc328607048 8.报告总结 PAGEREF _Toc328607048 h 331.进退法确定初始区间1.1 进退法基本思路:按照一定的规则试算若干个点,比较其函数值的大小,直至找到函数值按“高-低-高”变化的单峰区间。1.2 进退法程序框图1.3 题目:用进退法求解函数的搜索区间1.4 源程序代码及运行结果#includ

8、e #include main()float h,h0,y1,y2,y3,a1=0,a2,a3,fa2,fa3;scanf(h0=%f,y1=%f,&h0,&y1);h=h0;a2=h;y2=a2*a2-7*a2+10;if (y2y1)h=-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 (y3eps) if(y1=y2) a=a1; a1=a2; y1=y2; a2=a+0.618*(b-a); y2=f(a2); else b=a2;a2=a1;y2=y1; a1=b-0.618*(b-a)

9、; y1=f(a1); endend xxx=0.5*(a+b)f = Inline function: f(x) = x2-7*x+9xxx = 3.49973.牛顿型法 3.1牛顿型法基本思路:在邻域内用一个二次函数 来近似代替原目标函数,并将 的极小点作为对目标函数求优的下一个迭代点。经多次迭代,使之逼近目标函数的极小点。3.2 阻尼牛顿法的流程图: 3.3 题目:用牛顿阻尼法求函数的极小点3.4 源程序代码及结果: k=0; ptol=1.0e-5;xk=input(input x0:) itcl=1;1; while norm(itcl)=ptol f1=4*xk(1,1)3-24*

10、xk(1,1)2+50*xk(1,1)-4*xk(2,1)-32;-4*xk(1,1)+8*xk(2,1); G=12*xk(1,1)2-48*xk(1,1)+50,-4;-4,8; dk=-inv(G)*f1; a=-(dk*f1)/(dk*G*dk); xk=xk+a*dk; itcl=a*dk; k=k+1; endf=(xk(1,1)-2)4+(xk(1,1)-2*xk(2,1)2; fprintf(n %d x* f :n,k); disp(xk); disp(f); 结果显示:input x0:1;1 用阻尼牛顿法迭代 27 次后得到 极小点 x*及极小值 f 为: 2.0000

11、1.00001.3270e-0194.鲍威尔法 4.1 鲍威尔法基本思路:在不用导数的前提下,在迭代中逐次构造G的共轭方向。 4.2 鲍威尔法流程图: 43 题目:求函数f(x)= x0*x0+x1*x1-x0*x1-10*x0-4*x1+60的最优点,收敛精度=0.0014.4 源程序代码及结果: #include stdio.h#include stdlib.h#include math.hdouble objf(double x)double ff;ff=x0*x0+x1*x1-x0*x1-10*x0-4*x1+60;return(ff);void jtf(double x0,doubl

12、e 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=0;in;i+)*(x0+i)=*(x1+i);*(x1+i)=*(x2+i);f1=f2;f2=f3;for(;)h=2*h;for(i=0;in;i+)*

13、(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);elsefor(i=0;in;i+)ai=*(x0+i);bi=*(x2+i);for(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,

14、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);else for(i=0;in;i+)ai=*(x1+i);*(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+)xx

15、i=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=(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 powe

16、ll(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 *)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 *)

17、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=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

18、(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;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=

19、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);void main()double p=1,2;double ff,x2;ff=powell(p,0.3,0.001,0.0001,2,x);printf(x0=%f,x1=%f,ff=%fn,x0,x1,ff);getchar(); 5. 复合形法 5.1 复合行法基本思想:在可行域中选取K个设计点 (n+1K2n)作为初始复合形的顶点。比较各顶点目标函数值

20、的大小,去掉目标函数值最大的顶点(称最坏点),以坏点以外其余各点的中心为映射中心,用坏点的映射点替换该点,构成新的复合形顶点。 反复迭代计算,使复合形不断向最优点移动和收缩,直至收缩到复合形的顶点与形心非常接近,且满足迭代精度要求为止。 5.2 题目:求函数f(x)=(x1-5)*(x1-5)+4*(x2-6)*(x2-6)的最优点,约束条件为g1(x)=64-x1*x1-x2*x20;g2(x)=x2-x1-100;g3(x)=x1-100;收敛精度自定义;5.3 源程序代码及结果:#include #include #include #include #define E0 1e-5 /*复

21、合形法收敛控制精度*/ double *apply(int,int); /*申请矩阵空间*/ double f(double *); /*目标函数*/ double *g(double *); /*约束函数*/ bool judge(double *); /*可行点的判断*/ int main() int n,k; int i,j,k1; int l; double temporary; double restrain; /*收敛条件*/ double reflect; /*反射系数*/ srand(unsigned)time(NULL); printf(请输入目标函数的维数 n:); /*输

22、入已知数据*/ scanf(%d,&n); printf(请输入复合形的顶点数 k:); scanf(%d,&k); double *x=apply(k,n); /*存放复合形顶点*/ double *y=(double *)calloc(k,sizeof(double); /*存放目标函数值*/ double *p=(double *)calloc(3,sizeof(double); /*存放约束函数值*/ double *a=(double *)calloc(n,sizeof(double); /*存放设计变量的下限*/ double *b=(double *)calloc(n,sizeo

23、f(double); /*存放设计变量的上限*/ double *x_c=(double *)calloc(n,sizeof(double); /*存放可行点中心*/ double *x_r=(double *)calloc(n,sizeof(double); /*存放最坏点的反射点*/ printf(请输入选定的第一个可行点 x1(包含%d 个数):,n); for(i=0;in;i+) scanf(%lf,*x+i); printf(请输入初选变量的下限 a(包含%d 个数):,n); for(i=0;in;i+) scanf(%lf,a+i); printf(请输入初选变量的上限 b(包

24、含%d 个数):,n); for(i=0;in;i+) scanf(%lf,b+i); printf(输出输入结果为:nn=%d,k=%d,x1=(,n,k); /*输出已知数据*/ for(i=0;in-1;i+) printf(%.5lf ,*(*x+i); printf(%.5lf)na=(,*(*x+n-1);for(i=0;in-1;i+) printf(%f ,*(a+i); printf(%.5lf),b=(,*(a+n-1); for(i=0;in-1;i+) printf(%f ,*(b+i); printf(%.5lf)n,*(b+n-1); L1: for(i=1;ik;

25、i+) /*随机得到其余(k-1)个可行点*/for(j=0;jn;j+) *(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j); l=1; for(i=1;ik;i+) /*找出可行点的个数 l,并把可行点放在前 l 个位置上*/ if(judge(*(x+i) for(j=1;jk;j+) if(!judge(*(x+j) for(k1=0;k1n;k1+) temporary=*(*(x+i)+k1); *(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary; break;

26、l+; for(i=0;il-1;i+) /*把前 l 个可行点按目标函数值从大到小排序*/for(j=i+1;jl;j+)if(f(*(x+i)f(*(x+j)for(k1=0;k1n;k1+) temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary; for(i=0;in;i+) /*求可行点中心*/ *(x_c+i)=0;for(i=0;il;i+) for(j=0;jn;j+) *(x_c+j)+=*(*(x+i)+j);for(i=0;in;i+) *(x_c+i)/=l;if(!judge(x_

27、c) /*判断可行点中心是否可行*/ for(i=0;in;i+) *(a+i)=*(*(x+l-1)+i);*(b+i)=*(x_c+i); goto L1; else for(i=l;ik;i+) /*将不可行点可行化*/ do for(j=0;jn;j+) *(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j);while(!judge(*(x+i);L2:for(i=0;ik-1;i+) /*将可行点按目标函数值从大到小排序*/ for(j=i+1;jk;j+) if(f(*(x+i)f(*(x+j) for(k1=0;k1n;k1+) tempo

28、rary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1); *(*(x+j)+k1)=temporary; restrain=0; /*求收敛条件*/ for(i=0;ik;i+)restrain+=(f(*(x+i)-f(*(x+k-1)*(f(*(x+i)-f(*(x+k-1);restrain=sqrt(1.0/(k-1)*restrain); if(restrainE0) /*判断收敛条件*/ printf(n 求得约束最优点为:( );for(i=0;in;i+) printf(%.5f ,*(*(x+k-1)+i);printf()n 目标函数的最优解

29、为:%.5fn,f(*(x+k-1); return 0; else L3:for(i=0;in;i+) /*计算除去最坏点*x 外的(k-1)个顶点的中心*/ *(x_c+i)=0; for(i=1;ik;i+)for(j=0;jn;j+)*(x_c+j)+=*(*(x+i)+j); for(i=0;in;i+) *(x_c+i)/=k-1;reflect=1.3; L4:for(i=0;in;i+) /*求反射点*/ *(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i);if(!judge(x_r) reflect*=0.5;goto L4; else i

30、f(f(x_r)f(*x) for(i=0;in;i+) *(*x+i)=*(x_r+i); goto L2; else if(reflect=1e-10) for(i=0;in;i+) *(*x+i)=*(*(x+1)+i);goto L3; else reflect*=0.5;goto L4; double *apply(int row,int col) /*申请矩阵空间*/ int i; double *x=(double*)calloc(row*col,sizeof(double); double *y=(double *)calloc(row,sizeof(double *); if

31、(!x | !y) printf(内存分配失败!); exit(1); for(i=0;irow;i+) *(y+i)=x+i*col; return y; double f(double *x) /*目标函数*/ return (*x-5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)-6); double *g(double *x) /*约束函数*/ double *p=(double *)calloc(3,sizeof(double); if(!p) printf(内存分配失败!); exit(1); *p=64-(*x)*(*x)-(*(x+1)*(*(x+1); *(p+1

32、)=*(x+1)-*x-10; *(p+2)=*x-10; return p; bool judge(double *x) /*可行点的判断*/ int i; double *p=(double *)calloc(3,sizeof(double); p=g(x); for(i=0;i0) break; if(i=3) return true; else return false; 6. 外点惩罚函数法6.1解题思路:外点法是从可行域的外部构造一个点序列去逼近原约束问题的最优解。外点法可以用来求解含不等式和等式约束的优化问题。外点惩罚函数的形式为: 6.2 流程框图: 6.3 题目:求函数f(x

33、)=(x1-5)*(x1-5)+4*(x2-6)*(x2-6)的最优点,约束条件:g1(x)=64-x1*x1-x2*x20;g2(x)=x2-x1-100;g3(x)=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

34、 ;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 r); /鲍威尔方法函数double fxy(double x1,double

35、 x2,double x3,double r); /待求函数double ysearch(double x); /一维搜索的目标函数void search(double &a,double &b,double h); /区间搜索double yellowcut(double &a,double &b); /黄金分割void sort(double *p,int size);/选择法排序void main() /约束优化方法主函数入口 cout请输入精度e;changyan:Powell(r); double cmpare4; int flag1=0; for (int i=1;i=3;i+)

36、cmparei=x_i-x0i; if (fabs(cmparei)e) flag1+; if (flag1=3) printf(x1=%lf x2=%lfn,x_1,x_2);/ cout最优解为:x1=x_1 x2=x_2 x3=x_3endl ; cout最小值为fxy(x_1,x_2,x_3,r)endl; else for (int j=1;j0)?(64-x1*x1-x2*x2):0; n=(x2-x1-10)0)?(x2-x1-10):0; p=(x1-10)0)?(x1-10):0; return /惩罚函数(x1-5)*(x1-5)+4*(x2-6)*(x2-6)+r*(m*

37、m+n*n+p*p)+r*(x3*x3);void Powell(double r) /鲍威尔方法函数定义 double det=0.0001; /迭代精度 int k;my1: for (k=1;k=3;k+) m=3*k-2; double a=0,b=0,xo=0; search(a,b,1); /完成区间搜索 double temp; temp=yellowcut(a,b);/黄金分割法 int n=3*k-2; for (int i=1;i=3;i+) switch (k) case 1:x1i=x0i+temp*lamtan+;break; case 2:x2i=x1i+temp*

38、lamtan+;break; case 3:x3i=x2i+temp*lamtan+;break; default :break; double cmp4; int flag=0; for (int i=1;i=3;i+) cmpi=x3i-x0i; if (fabs(cmpi)det) flag+; if (flag=3) /找到最优解 x_1=x31; x_2=x32; x_3=x33; else double fy4; fy0=fxy(x01,x02,x03,r); fy1=fxy(x11,x12,x13,r); fy2=fxy(x21,x22,x23,r); fy3=fxy(x31,x

39、32,x33,r); double fyy3; for (int ii=0;ii3;ii+) fyyii=fyii-fyii+1; sort(fyy,3); for (ii=1;ii=fyy2) if (f3f4) for (int t=1;t=3;t+) x0t=x3t; else for (int t=1;t=3;t+) x0t=x4t; goto my1; else for (int t=0;t3;t+) lamta1t=x3t+1-x0t+1; m=0; /switch 标志! double aa=0,bb=0; search(aa,bb,1); double temp1; temp1

40、=yellowcut(aa,bb); for (int i=1;i=3;i+) x5i=x3i+temp1*lamta1i-1; for (i=1;i=3;i+) x0i=x5i; for (i=1;i=6;i+) lamtai=lamtai+3; for (i=1;i=y1) h=-h,a3=a1,y3=y1; a1=a2,y1=y2,a2=a3,y2=y3;a3=a2+h,y3=ysearch(a3);while(y3=y2) h=2*h; a1=a2,y1=y2,a2=a3,y2=y3; a3=a2+h,y3=ysearch(a3);if(h0)a=a3,b=a1;else a=a1,b

41、=a3;double yellowcut(double &a,double &b) double e; /黄金分割法求解 e=0.001; double c,fc; c=a+0.382*(b-a); fc=ysearch(c); double d,fd; double xo; d=a+0.618*(b-a); fd=ysearch(d);label2: if (fc=fd) b=d; d=c; fd=fc; c=a+0.382*(b-a); fc=ysearch(c); else a=c; c=d; fc=fd; d=a+0.618*(b-a); fd=ysearch(d); if (b-a)

42、=e) xo=(a+b)/2; else goto label2; return xo;void sort(double *p,int size)/选择法排序 int i,j; double k; for(i=0;isize-1;i+) for(j=i+1;j*(p+j)k=*(p+i);*(p+i)=*(p+j);*(p+j)=k;7.机械设计实际问题分析 7.1题目:图示为一对称的两杆支架,在支架的顶点承受一个载荷为2F=300000 ,支架之间的水平距离 2B=1520mm,若已选定壁厚T=2.5mm钢管,密度p=8300kg/m3,屈服点 ,材料的弹性模量 。要求在满足强度与稳定性条件

43、下设计最轻的支架尺寸。 7.2计算过程如下:解:计算压杆的临界柔度为:, 由于支架为空心杆,失效形式主要为屈服,故计算稳定性用屈服极限公式。根据题意可得方程组: , 代入整理得到内点混合惩罚函数法的标准形式为: 构建惩罚函数: ,取,解得:令迭代精度为:,由于函数是X的2次方程,故不必判别函数值的相对变化量。7.3 源程序编写 #include #include double GetX3( double r) return (1-42*sqrt(r)*(0.21*sqrt(r)+0.01*r)/(168.172*sqrt(r)-38*r)+0.0025;double GetX4( double

44、 r)return (0.21*sqrt(r)+0.01*r)/(168.172*sqrt(r)-38*r); double F( double x3,double x4) return 42.4315*(x3*x3-x4*x4);main() double x1=0,x2=0,x3,x4,r=1,c=0.01,m=0.0000001; int i=1; x3=GetX3(r); x4=GetX4(r); while(1) printf(迭代次数:%dn,i); printf(r=%.12fn,r); printf(x1=%fn,x3); printf(x2=%fn,x4); printf(n

45、); r=c*r; x1=x3; x2=x4; x3=GetX3(r); x4=GetX4(r); if(fabs(x1-x3)=m)&(fabs(x4-x2)=m) break; i+; printf(最优解为:n); printf(R=%f(单位:米)n,x3); printf(r=%f(单位:米)n,x4); printf(最小体积V=%f(单位:立方米)n,F(x3,x4); return(0);用C语言编程计算,求得结果为:最小外径R=3.749mm,最小内径r=1.249mm,最小体积:v=530000立方毫米故满足强度与稳定性条件下最轻的支架尺寸约为外径3.75mm,内径1.25

46、mm。8.报告总结 通过这一段时间的学习我了解到机械优化设计是以数学规划论为基础,以计算机为工具,一种自动寻优的先进的、现代的设计方法。根据设计所追求的性能目标,建立目标函数,在满足给定的各种约束条件下,寻求最优的设计方案。可见它是非常经典的一门学科。再加上王卫荣老师系统全面科学的教授过程,更是使这一学科魅力十足,强烈地吸引着我对它的深入学习和实践。在课程学习过程中我明白了很多工程问题是可以转化为数学模型并可以通过计算机求解。同时了解了delphi的基本的使用技巧,并且复习了C语言和matlab编程相关知识,并将其应用到了约束随机法、惩罚函数法去求解问题,收获颇多。优化设计同时也教会了我如何追

47、求“优”,同时使自己有能力、有办法“化”到优!附录资料:不需要的可以自行删除 C语言图形模式速成第一节 图形模式的初始化Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*.BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。 不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之

48、前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:void far initgraph(int far *gdriver, int far *gmode,char *path);其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见graphics. h。图形驱动程序由Turbo C出版商提供,文件扩展名为.BGI。 根据不同的图形适配器有不同的图形

49、驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。#include stdio.h#include graphics.hint main()int gdriver, gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C 提供了一个自动

50、检测显示器硬件的函数,其调用格式为:void far detectgraph(int *gdriver, *gmode);其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化:#include stdio.h#include graphics.hint main()int gdriver, gmode;detectgraph(&gdriver, &gmode); /*自动测试硬件*/printf(the graphics driver is %d, mode is %dn,gdriver,gmode); /*输出测试结果*/getch();initgraph(&g

51、driver, &gmode, C:TC2.0BGI);/* 根据测试结果初始化图形*/bar3d(100, 100, 300, 250, 50, 1); /*画一长方体*/getch();closegraph();return 0;上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法, 即用gdriver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:#include stdio.h#include graphics.hint main()int gdriver=DETECT, gmode;in

52、itgraph(&gdriver, &gmode, C:TC2.0BGI);bar3d(50, 50, 150, 30, 50, 1);getch();closegraph();return 0;另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为:void far closegraph(void);第二节 屏幕颜色的设置和清屏函数对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在Turbo C中分别用下面两个函数: 设置背景色: void far setbkcolor(int color);设置作图色: void far setcolor(in

53、t color);其中color 为图形方式下颜色的规定数值,对EGA,VGA显示器适配器,有关颜色的符号常数及数值见graphics.h。清除图形屏幕内容但不清除图形背景使用清屏函数,其调用格式如下: voide far cleardevice(void);#include stdio.h#include graphics.hint main()int gdriver, gmode, i,aa;gdriver=DETECT;initgraph(&gdriver, &gmode, C:TC2.0BGI); /*图形初始化*/setbkcolor(0); /*设置图形背景*/cleardevic

54、e();for(i=0; i=15; i+)setcolor(i); /*设置不同作图色*/circle(320, 240, 20+i*10); /*画半径不同的圆*/getch();for(i=0; i=15; i+)setbkcolor(i); /*设置不同背景色*/cleardevice();circle(320, 240, 20+i*10);getch();aa=getmaxcolor();printf(maxcolor=%d,aa);getch();closegraph();return 0;另外,TURBO C也提供了几个获得现行颜色设置情况的函数。 int far getbkco

55、lor(void); 返回现行背景颜色值。int far getcolor(void); 返回现行作图颜色值。int far getmaxcolor(void); 返回最高可用的颜色值。第三节 基本画图函数基本图形函数包括画点,线以及其它一些基本图形的函数。本节对这些函数作一全面的介绍。 、画点. 画点函数 void far putpixel(int x, int y, int color); 该函数表示有指定的象元画一个按color 所确定颜色的点。对于颜色color的值可从表3中获得而对x, y是指图形象元的坐标。在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640

56、x480,其中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到下所有象元的个数。屏幕的左上角坐标为(0,0),右下角坐标为(639, 479),水平方向从左到右为x 轴正向,垂直方向从上到下为y轴正向。TURBO C的图形函数都是相对于图形屏幕坐标,即象元来说的。关于点的另外一个函数是: int far getpixel(int x, int y); 它获得当前点(x, y)的颜色值。 II、有关坐标位置的函数 int far getmaxx(void);返回x轴的最大值。int far getmaxy(void);返回y轴的最大值。int far getx(void); 返回游

57、标在x轴的位置。void far gety(void); 返回游标有y轴的位置。void far moveto(int x, int y); 移动游标到(x, y)点,不是画点,在移动过程中亦画点。void far moverel(int dx, int dy); 移动游标从现行位置(x, y)移动到(x+dx, y+dy)的位置,移动过程中不画点。、画线I. 画线函数TURBO C提供了一系列画线函数: void far line(int x0, int y0, int x1, int y1); 画一条从点(x0, y0)到(x1, y1)的直线。void far lineto(int x,

58、 int y); 画一作从现行游标到点(x, y)的直线。void far linerel(int dx, int dy); 画一条从现行游标(x,y)到按相对增量确定的点(x+dx, y+dy)的直线。void far circle(int x, int y, int radius); 以(x, y)为圆心,radius为半径,画一个圆。void far arc(int x, int y, int stangle, int endangle,int radius); 以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。在TURBO C中

59、规定x轴正向为0 度,逆时针方向旋转一周, 依次为90,180, 270和360度(其它有关函数也按此规定,不再重述)。 void ellipse(int x, int y, int stangle, int endangle,int xradius,int yradius);以(x, y)为中心,xradius,yradius为x轴和y轴半径,从角stangle 开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时, 画出一个完整的椭圆。void far rectangle(int x1, int y1, int x2, inty2); 以(x1, y1)

60、为左上角,(x2, y2)为右下角画一个矩形框。 void far drawpoly(int numpoints, int far *polypoints); 画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。polypoints整型数组必须至少有2 倍顶点数个无素。每一个顶点的坐标都定义为x,y,并且x在前。值得注意的是当画一个封闭的多边形时,numpoints 的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。下面举一个用drawpoly()函数画箭头的例子。#include stdio.h#include graphi

温馨提示

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

评论

0/150

提交评论