1、机械优化设计实验报告.机械优化设计实验报告.1.进退法确立初始区间 . .31.1进退法基本思路 . .31.2进退法程序框图 . .31.3题目 . .31.4源程序代码及运转结果 . .32.黄金切割法 . .42.2黄金切割法流程图 .42.3题目 . .52.4源程序代码及结果 . .53.牛顿型法 .63.1牛顿型法基本思路 .63.2阻尼牛顿法的流程图 . .63.3题目 . .73.4源程序代码及结果 . .74.鲍威尔法 .84.1鲍威尔法基本思路 . .84.2鲍威尔法流程图 . .84 3 题目 . .94.4源程序代码及结果 . .95.复合形法 . .165.1复合行法
2、基本思想 . .165.3源程序代码及结果 . .176.外点处罚函数法 . .246.1解题思路: .246.2流程框图 . .246.3题目 . .256.4源程序代码及结果 . .257.机械设计实质问题剖析 . .367.2计算过程以下 .367.3源程序编写 . .378.报告总结 .40.1.进退法确立初始区间1.1 进退法基本思路: 依据必定的规则试算若干个点,比较其函数值的大小,直至找到函数值按“高 - 低- 高”变化的单峰区间。1.2 进退法程序框图1.3 题目:用进退法求解函数 f x x2 7x 10的搜寻区间1.4 源程序代码及运转结果#include #include
3、 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);elseb=a2;a2=a1;y2=y1;a1=b-0.618*(b-a);y1=f(a1);endend.
4、xxx=0.5*(a+b)f =Inline function:f(x) = x2-7*x+9xxx =3.49973.牛顿型法3.1牛顿型法基本思路 :在 xk 邻域内用一个二次函数x来近似取代原目标函数,并将x 的极小点作为对目标函数 fx 求优的下一个迭代点 xk1 。经多次迭代,使之迫近目标函数 f x 的极小点。3.2 阻尼牛顿法的流程图:开始给定 x 0 ,k 0dk 2 f ( xk ) 1 f (xk ).xk 1xkkdkk k 1k : min f (xkdk ).3.3 题目 : 用牛顿阻尼法求函数 f x1 , x2x1 24x1 2x2的极小点3.4 源程序代码及结果
5、:k=0;ptol=1.0e-5;xk=input( input x0: )itcl=1;1;while norm(itcl)=ptolf1=4*xk(1,1)3-24*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 ?o ? ?
6、D? x*? n?D?,k); f ?a:disp(xk);disp(f);结果显示: input x0:1;1用阻尼牛顿法迭代 27 次后获得 极小点 x* 及极小值 f 为 :.2.00001.00001.3270e-0194.鲍威尔法4.1 鲍威尔法基本思路 :在不用导数的前提下,在迭代中逐次结构 G的共轭方向。4.2 鲍威尔法流程图:.4 3 题 目 : 求 函 数 f ( x ) =x0*x0+x1*x1-x0*x1-10*x0-4*x1+60 的最长处,收敛精度=0.0014.4 源程序代码及结果:#include stdio.h#include stdlib.h#include
7、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,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+
8、)*(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+)*(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=*(
9、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,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+)
10、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+) 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,intn,double x)double *a,*b,ff;a=(double *)malloc(n*sizeo
11、f(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,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=(
12、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 *)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;
13、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;in;i+)
14、*(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);.void main()double p=1,2;double ff,x2;ff=powell(p,0.3
15、,0.001,0.0001,2,x);printf(x0=%f,x1=%f,ff=%fn,x0,x1,ff);getchar();5.复合形法5.1 复合行法基本思想: 在可行域中选用 K 个设计点 (n+1K2n)作为初始复合形的极点。 比较各极点目标函数值的大小,去掉目标函数值最大的极点 ( 称最坏点 ) ,以坏点之外其他各点的中心为映照中心, 用坏点的映照点替代该点, 组成新的复合形顶点。 频频迭代计算,使复合形不停向最长处挪动和缩短,直至缩短到复合形的极点与形心特别靠近,且知足迭代精度要求为止。.5.2 题目:求函数 f(x)=(x1-5)*(x1-5)+4*(x2-6)*(x2-6)
16、 的最长处,拘束条件为 g1(x)=64-x1*x1-x2*x2 0; g2(x)=x2-x1-10 0;g3(x)=x1-10 0;收敛精度自定义;5.3 源程序代码及结果 :#include #include #include #include #define E0 1e-5 /* 复合形法收敛控制精度 */double *apply(int,int); /*申请矩阵空间 */double f(double *); /*目标函数 */double *g(double *); /*拘束函数 */bool judge(double *); /*可行点的判断 */int main() int n
17、,k;int i,j,k1;int l;double temporary;double restrain; /*收敛条件 */double reflect; /*反射系数 */srand(unsigned)time(NULL);printf(请输入目标函数的维数 n:); /*输入已知数据 */scanf(%d,&n);printf(请输入复合形的极点数 k:);scanf(%d,&k);double *x=apply(k,n); /*寄存复合形极点 */double *y=(double *)calloc(k,sizeof(double); /*寄存目标函数值 */double *p=(do
18、uble *)calloc(3,sizeof(double); /*寄存拘束函数值 */double *a=(double *)calloc(n,sizeof(double); /*寄存设计变量的下限 */double *b=(double *)calloc(n,sizeof(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( 包括 %d 个数 ):,n);for(i=0;in;i+) scanf(%lf,b+i);p