机械优化设计二次插值法流程图
- 格式:doc
- 大小:56.00 KB
- 文档页数:1
郑州大学机械优化设计部分程序1.外推法2.黄金分割法3.二次插值法4.坐标轮换法5.随机方向法6.四杆机构优化设计1.外推法源程序:#include<>#include<>#define Rdouble fun(double x){ double m;m=x*x-10*x+36;return m;}void main(){double h0=R,y1,y2,y3,x1,x2,x3,h; x1=0;h=h0;x2=h;y1=fun(x1);y2=fun(x2);if(y2>y1){h=-h;x3=x1;y3=y1;x1=x2;y1=y2;x2=x3;y2=y3;}x3=x2+h;y3=fun(x3);while(y3<y2){h*=;x1=x2;y1=y2;x2=x3;y2=y3;x3=x2+h;y3=fun(x3);}printf("fun(%f)=%f,fun(%f)=%f,fun( %f)=%f\n",x1,y1,x2,y2,x3,y3);}运行过程及结果:fun=,fun=,fun=2.黄金分割法源程序:#include<>#include<>#define f(x) x*x*x*x-5*x*x*x+4*x*x-6*x+60double hj(double *a,double *b,double e,int *n){double x1,x2,s;if(fabs((*b-*a)/(*b))<=e)s=f((*b+*a)/2);else{x1=**(*b-*a);x2=*a+*(*b-*a);if(f(x1)>f(x2))*a=x1;else*b=x2;*n=*n+1;s=hj(a,b,e,n);}return s;}void main() {double s,a,b,e,m;int n=0;printf("输入a,b值和精度e值\n"); scanf("%lf %lf %lf",&a,&b,&e);s=hj(&a,&b,e,&n);m=(a+b)/2;printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\n ",a,b,s,m,n);}运行过程及结果:输入a,b值和精度e值-35a=,b=,s=,m=,n=213.二次插值法源程序:#include<>#include<>int main(void){doublea1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j[3];int i,h=1;void finding(double a[3]);finding(j);a1=j[0];a2=j[1];a3=j[2];m=;double f(double x);y1=f(a1);y2=f(a2);y3=f(a3);for(i=1;1>=1;i++){c1=(y3-y1)/(a3-a1);c2=((y2-y1)/(a2-a1)-c1)/(a2-a3); ap=*(a1+a3-c1/c2);yp=f(ap);if(fabs((y2-yp)/y2)<m)break;else if((ap-a2)*h>0){ if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;}}else if(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;}else{a1=ap;y1=yp;} }double x,y;if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f\n",x); printf("y*=%f\n",y); return 0;}double f(double x) {double y;y=x*x-10*x+36;return y;}void finding(double a[3]){int h,i;double y[3];a[0]=0;h=1;a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]); if(y[1]>y[0]){h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]); h=2*h;}while(y[2]<y[1]);}else{for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]); if(y[2]>=y[1])break;h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}运行过程及结果:a*=y*=4.坐标轮换法源程序:#include <>#include <>#include <>float fun1(float x,float a,float b) {float y;y=x+a*b;return y;}float fun2(float x,float y){float z;z=4*(x-5)*(x-5)+(y-6)*(y-6);return z;}main(){floatd[100][3],x[100][3],xx[3],ax[100][3]; floata1,a2,a3,h,t,y1,y2,y3,e,a,b,l,fi;int i,k;printf("输入初始点坐标\n");scanf("%f%f",&x[0][1],&x[0][2]); e=;l=;x[2][1]=x[0][1];x[2][2]=x[0][2];k=0;k--;do{x[0][1]=x[2][1];x[0][2]=x[2][2];k++;for(i=1;i<=2;i++){if(i==1){d[i][1]=1; d[i][2]=0;}else{d[i][1]=0;d[i][2]=1;}h=;a1=0;a2=h;x[i][1]=fun1(x[i-1][1],d[i][1],a1); x[i][2]=fun1(x[i-1][2],d[i][2],a1); y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2); x[i][2]=fun1(x[i-1][2],d[i][2],a2); y2=fun2(x[i][1],x[i][2]);if(y2>y1){h=-h;a3=a1;y3=y1;a1=a2;a2=a3;y1=y2;y2=y3;}a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]);do{a1=a2;y1=y2;a2=a3;y2=y3;a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]);}while(y3<y2);for(;a1>a3;){t=a3;a3=a1;a1=t; t=y1;y3=y1;y1=t;}a=a1;b=a3;a1=b-l*(b-a);a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1); x[i][2]=fun1(x[i-1][2],d[i][2],a1); y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2); x[i][2]=fun1(x[i-1][2],d[i][2],a2); y2=fun2(x[i][1],x[i][2]);if(b<1e-3){for(;fabs(b-a)>e;){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}else{for(;fabs((b-a)/b)>=e||fabs((y2-y1 )/y2)>=e;){if(y1>=y2){a=a1; a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}ax[k][i]=*(a+b);x[i][1]=fun1(x[i-1][1],d[i][1],ax[k][i]);x[i][2]=fun1(x[i-1][2],d[i][2],ax[k][i ]);}}while(sqrt(pow((x[2][1]-x[0][1]),2)+po w((x[2][2]-x[0][2]),2))>=1e-6);xx[1]=x[2][1];xx[2]=x[2][2];fi=fun2(xx[1],xx[2]);printf("最优解为\nx1*=%f\nx2*=%f\nf*=%f\nk=%d\n",xx[1],xx[2],fi,k); }运行过程及结果:输入初始点坐标89最优解为x1*=x2*=f*=k=25.随机方向法源程序:#include<>#include<>#include<>float f(float x,float y){float z;z=(x-2)*(x-2)+(y-1)*(y-1); return z;}float g1(float x,float y){float z;z=x*x-y;return z;}float g2(float x,float y){float z;z=x+y-2;return z;}void main(){int i,j;float k=8,c=,a0=-3,b0=3,a1=-3,b1=3; floatx[10],x0[10],xl[10],e[10],r[10],d[10], h,fl,f0,fx;while(g1(x0[0],x0[1])>0||g2(x0[0],x0[1 ])>0){x0[0]=a0+(rand()/*(b0-a0);x0[1]=a1+(rand()/*(b1-a1);}fl=f(x0[0],x0[1]);f0=f(x0[0],x0[1]);while(1){h=;j=1;r[0]=-1+(rand()/*(1-(-1));r[1]=-1+(rand()/*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}while(j<=k){j++;r[0]=-1+(rand()/*(1-(-1));r[1]=-1+(rand()/*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0) {fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}}x[0]=xl[0];x[1]=xl[1];while(1){h=*h;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)break;fx=f(x[0],x[1]);if(fx<fl) fl=fx; else break;}do{x[0]=x[0]-h*d[0];x[1]=x[1]-h*d[1];h=*h;if(h<c)break;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)continue;fx=f(x[0],x[1]);}while(fx>=fl);if(fabs((f0-fx)/f0)>=c){x0[0]=x[0];x0[1]=x[1];fl=fx;f0=fx;}elsebreak;}printf("输出最优解为\nx1*=%f,x2*=%f, y*=%f\n",x[0],x[1],fx);}运行过程及结果:输出最优解为x1*=,x2*=,y*=6.四杆机构优化设计源程序:#include<>#include<>#include<>#define Paiint g(float l1,float l2){if((-l1<=0)&&(-l2<=0)&&(6-l1-l2<=0)&&(1-l2-4<=0)&&(l2-l1-4<=0)&&(l1*l1+l2**l1*l2-16<=0)&&(36-l1*l1-l2**l1*l2<=0))return (1);elsereturn (0);}float fun(float x0[2]){floatf,a[31],b[31],r[31],p[31],q[31],w[31],x1 [2];int i;p[0]=acos(((1+x0[0])*(1+x0[0])-x0[ 1]*x0[1]+25)/(10+10*x0[0]));q[0]=acos(((1+x0[0])*(1+x0[0])-x0[ 1]*x0[1]-25)/(10*x0[1]));f=0;for(i=1;i<=30;i++){p[i]=p[0]+(Pai/60)*i;r[i]=sqrt(26-10*cos(p[i]));a[i]=acos((r[i]*r[i]+x0[1]*x0[1]-x 0[0]*x0[0])/(2*r[i]*x0[1]));b[i]=acos((r[i]*r[i]+24)/(10*r[i]) );q[i]=Pai-a[i]-b[i];w[i]=q[0]+(2*(p[i]-p[0])*(p[i]-p[0 ]))/(3*Pai);f=f+(Pai/60)*(q[i]-w[i])*(q[i]-w[i ])*(p[i]-p[i-1]);}return f;}void main(){floata,q,f,fl,f0,l[2],z[2],d0[100],d1[100], x[2],xi[2],fx,m0,m1,e;int i,j,n,k;printf("输入精度");scanf("%f",&e);do{z[0]=0+5*(rand()/;z[1]=0+5*(rand()/;}while(g(z[0],z[1])==0);for(i=0;i<=99;i++){d0[i]=-1+2*(rand()/;}for(j=0;j<=99;j++){d1[j]=-1+2*(rand()/;}f0=fun(z);fl=fun(z);ss:a=;for(i=0,j=0;i<=99&&j<=99;i++,j++) {n=1/sqrt((d0[i])*(d0[i])+d1[j]*d1[ j]);d0[i]=n*d0[i];d1[j]=n*d1[j];x[0]=z[0]+a*d0[i];x[1]=z[1]+a*d1[j];if(g(x[0],x[1])==1){f=fun(x);if(f<fl){fl=f;m0=d0[i];m1=d1[j];l[0]=x[0];l[1]=x[1];}}}x[0]=l[0];x[1]=l[1];do{a=*a;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==0)break;f=fun(x);if(f<fl)fl=f;else break;} while(g(z[0],z[1])==1); do{x[0]=x[0]-a*m0;x[1]=x[1]-a*m1;a=*a;if(a<break;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1; if(g(z[0],z[1])==1)f=fun(x);}while(f>=fl);if(fabs((f0-f)/f0)<e){xi[0]=x[0];xi[1]=x[1];fx=f;printf("最优解为\nx1*=%f\nx2*=%f\nfx=%f\n",xi[0],xi[1],fx);}else{f0=f;fl=f;z[0]=x[0];z[1]=x[1];goto ss;}}运行过程及结果:输入精度最优解为x1*=x2*=fx=。
郑州大学机械优化设计部分程序1、外推法2、黄金分割法3、二次插值法4、坐标轮换法5、随机方向法6、四杆机构优化设计1、外推法源程序:#include<stdio、h>#include<math、h>#define R 0、01double fun(double x){ double m;m=x*x-10*x+36;return m;}void main(){double h0=R,y1,y2,y3,x1,x2,x3,h; x1=0;h=h0;x2=h;y1=fun(x1);y2=fun(x2);if(y2>y1){h=-h;x3=x1;y3=y1;x1=x2;y1=y2;x2=x3;y2=y3;}x3=x2+h;y3=fun(x3); while(y3<y2){h*=2、0;x1=x2;y1=y2;x2=x3;y2=y3;x3=x2+h;y3=fun(x3);}printf("fun(%f)=%f,fun(%f)=%f,fun(%f)= %f\n",x1,y1,x2,y2,x3,y3);}运行过程及结果:fun(2、560000)=16、953600,fun(5、120000)=11、014400,fun(10、240000)=38、4576002、黄金分割法源程序:#include<stdio、h>#include<math、h>#define f(x) x*x*x*x-5*x*x*x+4*x*x-6*x+60double hj(double *a,double *b,double e,int *n) {double x1,x2,s;if(fabs((*b-*a)/(*b))<=e)s=f((*b+*a)/2);else{x1=*b-0、618*(*b-*a);x2=*a+0、618*(*b-*a);if(f(x1)>f(x2))*a=x1;else*b=x2;*n=*n+1;s=hj(a,b,e,n);}return s;}void main(){double s,a,b,e,m;int n=0;printf("输入a,b值与精度e值\n");scanf("%lf %lf %lf",&a,&b,&e);s=hj(&a,&b,e,&n);m=(a+b)/2;printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\n",a,b ,s,m,n);}运行过程及结果:输入a,b值与精度e值-350、0001a=3、279466,b=3、279793,s=22、659008,m=3、279629,n=213、二次插值法源程序:#include<stdio、h>#include<math、h> int main(void){double a1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j[3];int i,h=1;void finding(double a[3]);finding(j);a1=j[0];a2=j[1];a3=j[2];m=0、001;double f(double x);y1=f(a1);y2=f(a2);y3=f(a3);for(i=1;1>=1;i++){c1=(y3-y1)/(a3-a1);c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);ap=0、5*(a1+a3-c1/c2);yp=f(ap);if(fabs((y2-yp)/y2)<m)break;else if((ap-a2)*h>0){if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;}}else if(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;}else{a1=ap;y1=yp;}}double x,y;if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f\n",x);printf("y*=%f\n",y);return 0;}double f(double x){double y;y=x*x-10*x+36;return y;}void finding(double a[3]){int h,i;double y[3];a[0]=0;h=1;a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]);if(y[1]>y[0]){h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]);h=2*h;}while(y[2]<y[1]);}else{for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]);if(y[2]>=y[1])break;h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}运行过程及结果:a*=5、000000y*=11、0000004、坐标轮换法源程序:#include <stdio、h>#include <math、h>#include <conio、h>float fun1(float x,float a,float b) {float y;y=x+a*b;return y;}float fun2(float x,float y){float z;z=4*(x-5)*(x-5)+(y-6)*(y-6);return z;}main(){float d[100][3],x[100][3],xx[3],ax[100][3]; float a1,a2,a3,h,t,y1,y2,y3,e,a,b,l,fi;int i,k;printf("输入初始点坐标\n");scanf("%f%f",&x[0][1],&x[0][2]);e=0、000001;l=0、618;x[2][1]=x[0][1];x[2][2]=x[0][2];k=0;k--;do{x[0][1]=x[2][1];x[0][2]=x[2][2];k++;for(i=1;i<=2;i++){if(i==1){d[i][1]=1;d[i][2]=0;}else{d[i][1]=0;d[i][2]=1;}h=0、1;a1=0;a2=h;x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);if(y2>y1){h=-h;a3=a1;y3=y1;a1=a2;a2=a3;y1=y2;y2=y3;}a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3);y3=fun2(x[i][1],x[i][2]);do{a1=a2;y1=y2;a2=a3;y2=y3;a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3);x[i][2]=fun1(x[i-1][2],d[i][2],a3);y3=fun2(x[i][1],x[i][2]);}while(y3<y2);for(;a1>a3;){t=a3;a3=a1;a1=t;t=y1;y3=y1;y1=t;}a=a1;b=a3;a1=b-l*(b-a);a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);if(b<1e-3){for(;fabs(b-a)>e;){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}else{for(;fabs((b-a)/b)>=e||fabs((y2-y1)/y2)>=e; ){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}ax[k][i]=0、5*(a+b);x[i][1]=fun1(x[i-1][1],d[i][1],ax[k][i]);x[i][2]=fun1(x[i-1][2],d[i][2],ax[k][i]);}}while(sqrt(pow((x[2][1]-x[0][1]),2)+pow((x[2][2]-x[0][2]),2))>=1e-6);xx[1]=x[2][1];xx[2]=x[2][2];fi=fun2(xx[1],xx[2]);printf("最优解为\nx1*=%f\nx2*=%f\nf*=%f\nk=%d\n",xx[1],xx[2],fi,k);}运行过程及结果:输入初始点坐标89最优解为x1*=5、000000x2*=6、000000f*=0、000000k=25、随机方向法源程序:#include<math、h>#include<stdio、h>#include<stdlib、h>float f(float x,float y){float z;z=(x-2)*(x-2)+(y-1)*(y-1);return z;}float g1(float x,float y){float z;z=x*x-y;return z;}float g2(float x,float y){float z;z=x+y-2;return z; }void main(){int i,j;float k=8,c=0、000001,a0=-3,b0=3,a1=-3,b1=3;floatx[10],x0[10],xl[10],e[10],r[10],d[10],h,fl,f0,fx; while(g1(x0[0],x0[1])>0||g2(x0[0],x0[1])>0) {x0[0]=a0+(rand()/32767、00)*(b0-a0);x0[1]=a1+(rand()/32767、00)*(b1-a1);}fl=f(x0[0],x0[1]);f0=f(x0[0],x0[1]);while(1){h=0、01;j=1;r[0]=-1+(rand()/32767、00)*(1-(-1));r[1]=-1+(rand()/32767、00)*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}while(j<=k){j++;r[0]=-1+(rand()/32767、00)*(1-(-1));r[1]=-1+(rand()/32767、00)*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}}x[0]=xl[0];x[1]=xl[1];while(1){h=1、3*h;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)break;fx=f(x[0],x[1]);if(fx<fl) fl=fx;else break;}do{x[0]=x[0]-h*d[0];x[1]=x[1]-h*d[1];h=0、7*h;if(h<c)break;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)continue;fx=f(x[0],x[1]);}while(fx>=fl);if(fabs((f0-fx)/f0)>=c){x0[0]=x[0];x0[1]=x[1];fl=fx;f0=fx;}elsebreak;}printf("输出最优解为\nx1*=%f,x2*=%f,y*=%f\n",x[0],x[1],fx);}运行过程及结果:输出最优解为x1*=0、995421,x2*=1、004521,y*=1、009200 6、四杆机构优化设计源程序:#include<math、h>#include<stdio、h>#include<stdlib、h>#define Pai 3、1415926int g(float l1,float l2){if((-l1<=0)&&(-l2<=0)&&(6-l1-l2<=0)&&(1-l2-4<=0)&&(l2-l1-4<=0)&&(l1*l1+l2*l2-1、414*l1*l2-16<=0)&&(36-l1*l1-l2*l2-1、414*l1*l2<=0))return (1);elsereturn (0);}float fun(float x0[2]){floatf,a[31],b[31],r[31],p[31],q[31],w[31],x1[2];int i;p[0]=acos(((1+x0[0])*(1+x0[0])-x0[1]*x0[ 1]+25)/(10+10*x0[0]));q[0]=acos(((1+x0[0])*(1+x0[0])-x0[1]*x0[ 1]-25)/(10*x0[1]));f=0;for(i=1;i<=30;i++){p[i]=p[0]+(Pai/60)*i;r[i]=sqrt(26-10*cos(p[i]));a[i]=acos((r[i]*r[i]+x0[1]*x0[1]-x0[0]*x0[ 0])/(2*r[i]*x0[1]));b[i]=acos((r[i]*r[i]+24)/(10*r[i]));q[i]=Pai-a[i]-b[i];w[i]=q[0]+(2*(p[i]-p[0])*(p[i]-p[0]))/(3*P ai);f=f+(Pai/60)*(q[i]-w[i])*(q[i]-w[i])*(p[i]-p [i-1]);}return f;}void main(){floata,q,f,fl,f0,l[2],z[2],d0[100],d1[100],x[2],xi[2],f x,m0,m1,e;int i,j,n,k;printf("输入精度");scanf("%f",&e);do{z[0]=0+5*(rand()/32767、00);z[1]=0+5*(rand()/32767、00);}while(g(z[0],z[1])==0);for(i=0;i<=99;i++){d0[i]=-1+2*(rand()/32767、00);}for(j=0;j<=99;j++){d1[j]=-1+2*(rand()/32767、00);}f0=fun(z);fl=fun(z);ss:a=0、01;for(i=0,j=0;i<=99&&j<=99;i++,j++) {n=1/sqrt((d0[i])*(d0[i])+d1[j]*d1[j]);d0[i]=n*d0[i];d1[j]=n*d1[j];x[0]=z[0]+a*d0[i];x[1]=z[1]+a*d1[j];if(g(x[0],x[1])==1){f=fun(x);if(f<fl){fl=f;m0=d0[i];m1=d1[j];l[0]=x[0];l[1]=x[1];}}}x[0]=l[0];x[1]=l[1];do{a=1、3*a;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==0)break;f=fun(x);if(f<fl)fl=f;else break;}while(g(z[0],z[1])==1);do{x[0]=x[0]-a*m0;x[1]=x[1]-a*m1;a=0、7*a;if(a<0、00001)break;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==1)f=fun(x);}while(f>=fl);if(fabs((f0-f)/f0)<e){xi[0]=x[0];xi[1]=x[1];fx=f;printf("最优解为\nx1*=%f\nx2*=%f\n fx=%f\n",xi[0],xi[1],fx);}else{f0=f;fl=f;z[0]=x[0];z[1]=x[1];goto ss;}}运行过程及结果:输入精度0、001最优解为x1*=4、161386x2*=2、311257fx=0、000021。
第02章优化计算方法2.1黄金分割法黄金分割法也称0.618法,是通过对黄金分割点函数值的计算和比较,将初始区间逐次进行缩小,直到满足给定的精度要求,即求得一维极小点的近似解。
一、方法概述(一)区间缩小的基本思路已知的单峰区间。
为了缩小区间,在内按一定规则对称地取2个内部点和,并计算和。
可能有三种情况:图(a)经过一次函数比较,区间缩小一次。
在新的区间内,保留一个好点和,下一次只需再按一定规则,在新区间内找另一个与对称的点,计算,与比较。
如此反复。
图(b)淘汰,另,得新区间。
图(c)可归纳入上面任一种情况处理。
(二)取点规则黄金分割法的关键是如何不断找出区间内的2个对称点,保证极小点不会丢掉,且收敛快。
设初始区间长度为l,第一次区间缩短率为,则缩短后的区间长度为。
第二次区间缩短时,在区间中取点,经比较后又得新区间。
由对称性可知,区间的长度为,则本次区间缩短率为令这两次缩短率相等,即,得方程解方程,得合理的根为由此可知,黄金分割法的均匀缩短率为0.618,即每经过一次函数值比较,都是淘汰本次区间的0.382倍。
根据上式,黄金分割法的取点规则是为了使最终区间收敛到给定收敛精度内,区间的缩短次数N必须满足:即二、收敛准则由于实际问题的需要和函数形态的不同,常常需要不同的收敛准则确定最优点。
对于直接法,有以下几种收敛准则:(1)区间绝对精度;(2)区间相对精度;(3)函数值绝对精度;(4)函数值相对精度三、方法特点(一)黄金分割法特点(1)不必要求可微,只要利用函数值大小的比较,即可很快地找到;(2)除了第一次缩小区间要计算两个点及其函数值以外,其余每次只要计算一个点及其函数值;(3)可靠性好。
(二)应用举例实际一个圆柱螺旋压缩弹簧,不考虑共振,要求重量W最轻。
解:建模前,先列出弹簧的有关设计计算公式:式中-------弹簧的设计载荷;-------弹簧的总变形量;-------弹簧指数;K-------曲度系数;n-------工作有效圈数;n2-------不起作用圈数(总圈数与工作有效圈数之差);-------材料密度。
《机械优化设计》习题与答案机械优化设计习题及参考答案1-1.简述优化设计问题数学模型的表达形式。
答:优化问题的数学模型是实际优化设计问题的数学抽象。
在明确设计变量、约束条件、⽬标函数之后,优化设计问题就可以表⽰成⼀般数学形式。
求设计变量向量[]12Tn x x x x =L 使 ()min f x →且满⾜约束条件()0(1,2,)k h x k l ==L ()0(1,2,)j g x j m ≤=L2-1.何谓函数的梯度?梯度对优化设计有何意义?答:⼆元函数f(x 1,x 2)在x 0点处的⽅向导数的表达式可以改写成下⾯的形式:??=??+??=??2cos 1cos 212cos 21cos 1θθθθxo x f x f xo x f xo x f xo d fρ令xo Tx f x f x f x fx f ??=????=?21]21[)0(,则称它为函数f (x 1,x 2)在x 0点处的梯度。
(1)梯度⽅向是函数值变化最快⽅向,梯度模是函数变化率的最⼤值。
(2)梯度与切线⽅向d 垂直,从⽽推得梯度⽅向为等值⾯的法线⽅向。
梯度)0(x f ?⽅向为函数变化率最⼤⽅向,也就是最速上升⽅向。
负梯度-)0(x f ?⽅向为函数变化率最⼩⽅向,即最速下降⽅向。
2-2.求⼆元函数f (x 1,x 2)=2x 12+x 22-2x 1+x 2在T x ]0,0[0=处函数变化率最⼤的⽅向和数值。
解:由于函数变化率最⼤的⽅向就是梯度的⽅向,这⾥⽤单位向量p表⽰,函数变化率最⼤和数值时梯度的模)0(x f ?。
求f (x1,x2)在x0点处的梯度⽅向和数值,计算如下:()-=??+-==?120122214210x x x x f x f x f 2221)0(??+ =x f x f x f =5-=??????-=??=5152512)0()0(x f x f p ?2-3.试求⽬标函数()2221212143,x x x x x x f +-=在点X 0=[1,0]T 处的最速下降⽅向,并求沿着该⽅向移动⼀个单位长度后新点的⽬标函数值。
2015-16 学年一学期研究生课程考核(读书报告、研究报告)考核科目:现代设计方法与应用学生所在院(系):机械工程学院学生所在学科:机械工程姓名:学号:题目:优化设计中的二次插值算法优化设计中的二次差值算法摘要:机械优化设计主要包括建立优化设计问题的数学模型和选择合适的优化方法及程序两方面的内容。
基于二次插值法的基本原理,通过实例进行求解,计算结果说明了二次插值法是一种求解一元函数极小点问题最优解的可行高效的方法。
关键词:优化设计;数学模型;二次插值法Abstract:Mechanical optimization design includes a mathematical model of optimization design and selection of two aspects of suitable optimization methods and procedures. Based on the principle of quadratic interpolation method, by solving examples, the results illustrate the quadratic interpolation method is a feasible and efficient method for solving a problem metafunction minima optimal solution.Keywords: optimization design; mathematical model, quadratic interpolation1优化设计发展概况优化设计是20世纪60年代初结合最优化原理和计算机技术而发展起来的一门新的学科,正是这种方法吸纳了数学规划理论的研究成果和利用了数字计算机的高速运算能力,因此,它为工程设计提供一种科学高效的设计方法[1]。
简述二次插值法的迭代过程一、原理介绍二次插值法是一种基于二次函数的插值方法,它利用已知的两个点的函数值和导数值,通过构建一个二次插值多项式,来逼近函数的根。
该方法的基本思想是,通过构造一个二次函数,使得该函数与待求解的非线性方程在两个已知点处的函数值和导数值相等,然后利用二次插值多项式的根来逼近方程的根。
二、迭代步骤二次插值法的迭代步骤如下:1. 选择两个初始点a和b,使得f(a)和f(b)异号,即f(a) * f(b) < 0。
这样可以保证方程在[a, b]之间存在根。
2. 在[a, b]区间内,根据二次插值多项式的构造原理,可以得到一个二次函数p(x),使得p(a) = f(a),p(b) = f(b),p'(a) = f'(a),p'(b) = f'(b)。
其中,f(x)为待求解的非线性方程。
3. 求解二次函数p(x)的根x0,即p(x0) = 0。
可以通过求解二次方程的公式来得到根的近似值。
4. 判断x0是否在[a, b]区间内。
如果x0不在[a, b]区间内,则重新选择a和b,并返回第2步。
如果x0在[a, b]区间内,则进入下一步。
5. 判断f(x0)的值是否满足收敛条件,即|f(x0)| < ε,其中ε为预设的收敛精度。
如果满足收敛条件,则x0为方程的近似解,结束迭代。
如果不满足收敛条件,则将x0作为新的b值,并重新选择一个新的a值,并返回第2步。
三、迭代收敛性二次插值法的迭代过程中,根的选择和收敛性是关键。
在选择根的初始点a和b时,需要满足f(a) * f(b) < 0,这样可以保证方程在[a, b]之间存在根。
在选择新的a和b时,一般会选择离根较近的点,以加快迭代速度。
对于二次插值法的收敛性,一般情况下是收敛的。
但是,如果方程的根处于函数的驻点或拐点附近,可能会导致迭代过程发散。
因此,在实际应用中,需要对迭代过程进行控制,设置合适的迭代次数或收敛精度,以确保迭代过程的稳定性和收敛性。
二次插补二次插补算法及其目的和应用插补:数控车床的运动控制中,工作台(刀具)X、Y、Z轴的最小移动单位是一个脉冲当量。
因此,刀具的运动轨迹是具有极小台阶所组成的折线(数据点密化)。
例如,用数控车床加工直线OA、曲线OB,刀具是沿X轴移动一步或几步(一个或几个脉冲当量Dx),再沿Y轴方向移动一步或几步(一个或几个脉冲当量Dy),直至到达目标点。
从而合成所需的运动轨迹(直线或曲线)。
数控系统根据给定的直线、圆弧(曲线)函数,在理想的轨迹上的已知点之间,进行数据点密化,确定一些中间点的方法,称为插补。
二次插补法:二次插补算法是指插补分粗插补和精插补两部份,粗插补由软件实现,精插补由硬件完成。
该方法可应用于步进开环数控系统和脉冲式全数字交流伺服系统,大大提高了系统的性能指标,即实时性和可靠性。
这种算法主要应用于多轴联动、机械手、机器人等运动控制的设计。
插补运算的完成采用类似上、下位机的形式。
粗插补部分由上位计算机来完成,在每个插朴运算周期里输出的不是单个脉冲,而是一个直线段(位置增量坐标值),粗插补采用完全离线进行;精插补部分由硬件智能运动控制器来实时完成,主要完成各控制轴的轨迹规划和精确定位运动。
这样,粗插补完全离线进行,而精插补采用实时控制,一方面系统的实时性较好,另一方面可把上位计算机解放出来去完成更重要的工作。
二次插补算法中的粗插补算法:我们知道,物体运行的轨迹不管是空间的还是平面的,最终都可以离散成两种最基本的单元:空间直线和空间圆弧,可用大量成熟的软件来完成这部分,从宏观轨迹离散成微观两种最基本单元的工作,如Unigraph、Pro/ENGINEER、Cimatron、Mastercam等等,在通常的控制系统中读入的轨迹代码就是这两种最基本的单元。
下面仅就这两种基本单元来设计它们的算法。
空间直线的粗插补算法:空间直线离散成微直线段,得到微直线段实际上是要得到在某个数值范围内的位置增量坐标值ΔX、ΔY、ΔZ。