机械优化设计鲍威尔法编程
- 格式:docx
- 大小:37.43 KB
- 文档页数:4
机械优化设计matlab优化设计程序学校:班级:学号:姓名:指导老师:一.进退法求最优点所在区间1.算例:函数:f=x(1)^3+x(2)^2-10*x(1)*x(2)+1;初始参数:x0=0,step=0.01,st=[0,0],sd=[1,1];2.编程代码:function [lb,ub]=jintuifa(x0,step0,st,sd)% lb为区间下限,up为区间上限% x0初始探测点,step0是初始探测步长,st初始搜索点,sd是初始搜索方向step=step0;f0=jintui(x0,st,sd);x1=x0+step0;f1=jintui(x1,st,sd);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2;f1=f0;f0=f2;endendendend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd)f=objfun(st+a.*sd);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=objfun(x)f=x(1)^3+x(2)^2-10*x(1)*x(2)+1;end3.运行结果二.黄金分割法求最求最优值1.eg:函数:f=x^2+2*x;初始参数:a=-3,b=5,e=0.0001;2.编程代码:function [ans,sp]=golden(a,b,e)%[a,b]初始区间,e为最小区间长度要求%ans为最优解,sp为所需迭代次数a(1)=a;b(1)=b;L=e;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;m(1)=feval('f1',t(1));n(1)=feval('f1',u(1));while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endm(k+1)=feval('f1',t(k+1));n(k+1)=feval('f1',u(k+1));ans=feval('f1',t(k+1));k=k+1;endans=(a(k)+b(k))/2;sp=k-1;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function y=f1(x)y=x^2+2*x;end3.运行结果三.无约束优化方法——坐标轮换法1.eg:函数:min f(x)=4*(x(1)-5)^2+(x(2)-6)^2;初始参数:初始点x为[8,9];2.编程代码:function [x,f]=lunhuan(x0)%输入初始点x0[8,9]%输出最优解点x,与最优解值fp=1;h=0.000001;x=x0;while(p>h)%做精度比较w=x(1);q=x(2);d1=[1,0];a1=golden('objfun',x,d1);%黄金分割法求最佳步长 x=x+a1*d1;d2=[0,1];a2=golden('objfun',x,d2);x=x+a2*d2;p=sqrt((x(1)-w)^2+(x(2)-q)^2);endf=objfun(x);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=objfun(x)%函数名f=4*(x(1)-5)^2+(x(2)-6)^2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [lb,ub]=jintuifa(st,sd)%进退法函数x0=0;step0=0.000001;step=step0;f0=jintui(x0,st,sd);x1=x0+step0;f1=jintui(x1,st,sd);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2;f1=f0;f0=f2;endendendend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd)f=objfun(st+a.*sd);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ans=golden(f_name,st,sd)[a,b]=jintuifa(st,sd); %进退法求最佳步长区间a(1)=a;b(1)=b;L=0.1;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;p=st+t(1)*sd;q=st+u(1)*sd;m(1)=feval(f_name,p);n(1)=feval(f_name,q);while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endw=st+t(k+1)*sd;z=st+u(k+1)*sd;m(k+1)=feval(f_name,w);n(k+1)=feval(f_name,z);ans=feval(f_name,w);k=k+1;endt(k)=0;u(k)=0;m(k)=0;n(k)=0;p=[a',b',t',u',m',n'];ans=(a(k)+b(k))/2;end3.运行结果四.无约束优化方法——鲍威尔法1.eg:函数:min f(x)=4*(x(1)-5)^2+(x(2)-6)^2;初始参数:初始点x为[8,9],初始搜索方向[0,1],[1,0];2.编程代码:function [x,f]=powill(x0,d1,d2)%输入x0为初始点,d1,d2为两个线性无关向量for k=1:2w=x0(1);q=x0(2);a1=golden('objfun',x0,d1);x1=x0+a1*d1;a2=golden('objfun',x1,d2);x2=x1+a2*d2;d1=d2;d2=x2-x0;a3=golden('objfun',x2,d2);x3=x2+a3*d2;x0=x3;endx=x0;f=objfun(x);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=objfun(x)f=4*(x(1)-5)^2+(x(2)-6)^2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [lb,ub]=jintuifa(st,sd)x0=0;step0=0.0001;step=step0;f0=jintui(x0,st,sd);x1=x0+step0;f1=jintui(x1,st,sd);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2;f1=f0;f0=f2;endendend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd)f=objfun(st+a.*sd);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ans=golden(f_name,st,sd)[a,b]=jintuifa(st,sd);a(1)=a;b(1)=b;L=0.1;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;p=st+t(1)*sd;q=st+u(1)*sd;m(1)=feval(f_name,p);n(1)=feval(f_name,q);while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endw=st+t(k+1)*sd;z=st+u(k+1)*sd;m(k+1)=feval(f_name,w);n(k+1)=feval(f_name,z);ans=feval(f_name,w);k=k+1;endend3.运行结果五.有约束优化方法——复合形法1.eg:函数:min f(x)=x1^2+x2^2-x1*x2-10*x1-4*x2+60 St:g1(x)=-x1≤0g2(x)=-x2≤0g3(x)=x1-6≤0g4(x)=x2-8≤0g5(x)=x1+x2-11≤02.编程代码:function fuhexing(n,b,h,xb1,xb2)%元素数n,初始可行点b,精度h,xb1横坐标上下界,xb2为纵坐标上下界if (rem(n,2)==0)k=n+n/2;elsek=n+(n+1)/2;end%取k值A=kexingdian(k,xb1,xb2,b');%确定可行点A=mubiao(A,n,k,h);%求出目标函数并排序比较,得出最优解End %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function A=mubiao(A,n,k,h)for i=1:kA(3,i)=objfun(A(:,i));endB=A';%根据目标函数值排序A=sortrows(B,3)';p=0;for j=1:kx=(objfun(A(:,j))-objfun(A(:,1)))^2;p=p+x;endo=sqrt(p/(k-1));%收敛条件if(o<h)%判断所求点是否为最优点disp('最优点为')xz(1)=A(1,1);xz(2)=A(2,1);disp(xz);disp('其函数值为')f=A(3,1);disp(f);elsexr=Xcpanduan(A,k,n,h,1.3);endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function A=kexingdian(k,xb1,xb2,b)A=zeros(3,k);A(1,1)=b(1);A(2,1)=b(2);for i=2:kA(1,i)=xb1(1)+rand(1)*(xb1(2)-xb1(1));A(2,i)=xb2(1)+rand(1)*(xb2(2)-xb2(1));%产生j个顶点endt=0;for j=1:kif(A(1,j)+A(2,j)<=11&&A(1,j)<=6&&A(2,j)<=8)%判断是否有不可行点t=t+1;T(:,t)=A(:,j);endendif(t<k)%计算出可行点的中心位置xcxc=zhongxindian(T,t);endt=0;for j=1:k%利用中心点将原不可行点逼近为可行点while(A(1,j)+A(2,j)>11||A(1,j)>6||A(2,j)>8)A(:,j)=xc+0.5*(A(:,j)-xc);endendendx=x0;f=objfun(x);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function f=objfun(x)f= x1^2+x2^2-x1*x2-10*x1-4*x2+60;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xc=Xcpanduan(A,k,n,h,a)for i=1:k-1T(:,i)=A(:,i);endxc=zhongxindian(T,k-1);%计算除最坏点以外的可行点中心坐标if(xc(1)+xc(2)<=11&&xc(1)<=6&&xc(2)<=8)%判断xc是否可行xr=Xrpanduan(xc,A,a,n,k,h);A(:,k)=xr;else%不可行时,即重新确定初始可行点fuhexing(n,h,A(:,1),xr);endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xc=zhongxindian(T,t)xc=[0;0;0];for i=1:txc=xc+T(:,i);endxc=xc/t;%求解中心点end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function xr=Xrpanduan(xc,A,a,n,k,h)xr=xc+a*(xc-A(:,k));while(xr(1)+xr(2)>11||xr(1)>6||xr(2)>8)%判断xr 是否可行若不可行,则持续迭代a=0.5*a;xr=xc+a*(xc-A(:,k));endxr=ercipanduan(a,xr,A(:,k),A,n,k,xc,h,xr);%可行时进入下一判断end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function xr=ercipanduan(a,p,b,A,n,k,xc,h,t)if(objfun(p)>=objfun(b))%判断反射点和最坏点函数值的大小if(a<=1e-10)A(:,k)=A(:,k-1);xr=Xcpanduan(A,k,n,h,a);disp(xr);elsea=0.5*a;xr=Xrpanduan(xc,A,a,n,k,h);%返回中心点判断,持续迭代endelseA(:,k)=p;%以反射点取代最坏点进行循环mubiao(A,n,k,h);xr=t;endend3.运行结果五.有约束优化方法——混合惩罚法1.eg:函数:min f(x)=(x(4)-x(1))^2+(x(5)-x(2))^2+(x(6)-x(3))^2;St:g1=x(1)^2+x(2)^2+x(3)^2-5;g2=(x(4)-3)^2+x(5)^2-1;g3=x(6)-8;g4=4-x(6);2.编程代码function [x,f]=hunhechengfa(x0,r0,c,h1,h2)k=1;z=0;A(:,1)=x0;r(1)=r0;while (z==0)k=k+1;x=lunhuan(x0,r(k-1));A(:,k)=x;r(k)=c*r(k-1);z=shoulian(A,r,h1,h2,k);if(z==1)break;endx0=x;enddisp('最优解点x=');disp(x);disp('最优值=');f=fhanshu(x);disp(f);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function z=shoulian(A,r,h1,h2,k)%判断收敛条件U=abs(objfun(A(:,k),r(k))-objfun(A(:,k-1),r(k-1))/obj fun(A(:,k-1),r(k-1)));V=0;for i=2:kV=V+(A(1,k)-A(1,k-1))^2;endV=sqrt(V);if(U<=h1&&V<=h2)z=1;elsez=0;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function p=objfun(x,r)%φ函数g1=x(1)^2+x(2)^2+x(3)^2-5;g2=(x(4)-3)^2+x(5)^2-1;g3=x(6)-8;g4=4-x(6);j=sqrt(r);u=r*(1/g1+1/g2+1/g3+1/g4);v=(g1^2+g2^2+g3^2+g4^2)/j;p=fhanshu(x)-u+v;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function f=fhanshu(x)%目标函数f=(x(4)-x(1))^2+(x(5)-x(2))^2+(x(6)-x(3))^2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function x=lunhuan(x0,r)%轮换法p=1;h=0.01;d=zeros(6,6);a=zeros(6,1);x=x0;for i=1:6for j=1:6if(i==j)d(i,j)=1;endendendwhile(p>h)t=x;v=0;for k=1:6a(k)=golden(x,d(:,k),r);c=d(:,k);x=x-a(k)*c';v=v+(x(k)-t(k))^2;endp=sqrt(v);endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function ans=golden(st,sd,r)%黄金分割法求最佳步长 [g,h]=jintuifa(st,sd,r);a(1)=g;b(1)=h;L=0.01;t(1)=a(1)+0.382*(b(1)-a(1));u(1)=a(1)+0.618*(b(1)-a(1));k=1;p=st+t(1)*sd';q=st+u(1)*sd';m(1)=objfun(p,r);n(1)=objfun(q,r);while(b(k)-a(k)>L)if(m(k)>n(k))a(k+1)=t(k);b(k+1)=b(k);t(k+1)=u(k);u(k+1)=a(k+1)+0.618*(b(k+1)-a(k+1));elsea(k+1)=a(k);b(k+1)=u(k);u(k+1)=t(k);t(k+1)=a(k+1)+0.382*(b(k+1)-a(k+1));endw=st+t(k+1)*sd';z=st+u(k+1)*sd';m(k+1)=objfun(w,r);n(k+1)=objfun(z,r);k=k+1;endans=(a(k)+b(k))/2;end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=jintui(a,st,sd,r)%代入步长f=objfun(st+a.*sd',r);end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [lb,ub]=jintuifa(st,sd,r)%进退法求最佳步长区间x0=0;step0=0.001;step=step0;f0=jintui(x0,st,sd,r);x1=x0+step0;f1=jintui(x1,st,sd,r);if f1<=f0while truestep=2*step;x2=x1+step;f2=jintui(x2,st,sd,r);if f1<=f2lb=x0;ub=x2;break;elsex0=x1;x1=x2;f0=f1;f1=f2;endendelsewhile truestep=2*step;x2=x0-step;f2=jintui(x2,st,sd,r);if f0<=f2lb=x2;ub=x1;break;elsex1=x0;x0=x2; f1=f0; f0=f2;endendend3.运行结果。
#include"stdio.h"#include"stdlib.h"#include"math.h"double objf(double x[]){double ff;ff=x[0]*x[0]+2*x[1]*x[1]-2*x[0]*x[1]-4*x[0];return(ff);}double gold(double a[],double b[],double eps,int n,double xx[]) {int i;double f1,f2,*x[2],ff,q,w;for(i=0;i<2;i++)x[i]=(double *)malloc(n*sizeof(double));for(i=0;i<n;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(f1>f2){for(i=0;i<n;i++){b[i]=*(x[0]+i);*(x[0]+i)=*(x[1]+i);}f1=f2;for(i=0;i<n;i++)*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);f2=objf(x[1]);}else{ for(i=0;i<n;i++){a[i]=*(x[1]+i);*(x[1]+i)=*(x[0]+i);}f2=f1;for(i=0;i<n;i++)*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);f1=objf(x[0]);}q=0;for(i=0;i<n;i++)q=q+(b[i]-a[i])*(b[i]-a[i]);}while(w>eps);for(i=0;i<n;i++)xx[i]=0.5*(a[i]+b[i]);ff=objf(xx);for(i=0;i<2;i++)free(x[i]);return(ff);}void jtf(double x0[],double h0,double s[],int n,double a[],double b[]) {int i;double *x[3],h,f1,f2,f3;for(i=0;i<3;i++)x[i]=(double *)malloc(n*sizeof(double));h=h0;for(i=0;i<n;i++)*(x[0]+i)=x0[i];f1=objf(x[0]);for(i=0;i<n;i++)*(x[1]+i)=*(x[0]+i)+h*s[i];f2=objf(x[1]);if(f2>=f1){h=-h0;for(i=0;i<n;i++)*(x[2]+i)=*(x[0]+i);f3=f1;for(i=0;i<n;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}for(;;){h=2*h;for(i=0;i<n;i++)*(x[2]+i)=*(x[1]+i)+h*s[i];f3=objf(x[2]);if(f2<f3) break;else{ for(i=0;i<n;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);f1=f2;f2=f3;}}if(h<0)for(i=0;i<n;i++){a[i]=*(x[2]+i);b[i]=*(x[0]+i);}elsefor(i=0;i<n;i++){a[i]=*(x[0]+i);b[i]=*(x[2]+i);}for(i=0;i<3;i++)free(x[i]);}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,double epsg,int n,double x[]) {int i,j,m;double *xx[4],*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++)xx[i]=(double *)malloc(n*sizeof(double));for(i=0;i<n;i++)*(xx[0]+i)=p[i];{for(i=0;i<n;i++){*(xx[1]+i)=*(xx[0]+i);x[i]=*(xx[1]+i);}f0=f1=objf(x);dlt=-1;for(j=0;j<n;j++){for(i=0;i<n;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(df>dlt){dlt=df;m=j;}}sdx=0;for(i=0;i<n;i++)sdx=sdx+fabs(x[i]-(*(xx[1]+i)));if(sdx<eps){free(ss);free(s);for(i=0;i<4;i++)free(xx[i]);return(f);}for(i=0;i<n;i++)*(xx[2]+i)=x[i];f2=f;for(i=0;i<n;i++){*(xx[3]+i)=2*(*(xx[2]+i)-(*(xx[1]+i))); x[i]=*(xx[3]+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((f3<f1)||(q<d)){if(f2<=f3)for(i=0;i<n;i++)*(xx[0]+i)=*(xx[2]+i);for(i=0;i<n;i++)*(xx[0]+i)=*(xx[3]+i);}else{for(i=0;i<n;i++){*(ss+(i+1)*(n+1))=x[i]-(*(xx[1]+i));*(s+i)=*(ss+(i+1)*(n+1));}f=oneoptim(xx[0],s,h0,epsg,n,x);for(i=0;i<n;i++)*(xx[0]+i)=x[i];for(j=m+1;j<=n;j++)for(i=0;i<n;i++)*(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);}}}void main(){double p[]={1,2};double ff,x[2];ff=powell(p,0.3,0.001,0.0001,2,x);printf("x[0]=%f,x[1]=%f,ff=%f\n",x[0],x[1],ff); getchar();}。
机械优化设计——鲍威尔法机械优化设计班级:0841001成员:张波2010213217张建2010213214潘阳瑞20102132272013年6月鲍威尔法鲍威尔(Powell)法是直接利用函数值来构造共轭方向的一种方法。
基本思想:在不用导数的前提下,在迭代中逐次构造G 的共轭方向。
一(基本算法:(二维情况描述鲍威尔的基本算法)0T1)任选一初始点x,再选两个线性无关的向量,如坐标轴单位向量e=[1,0]和1T=[0,1]作为初始搜索方向。
e20002)从出发,顺次沿、作一维搜索,得、点,两点连线得一新 xeexx12121001方向 d,x,xd2011 用代替e形成两个线性无关向量,e,作为下一轮迭代的搜索方向。
再从xdd1,1201出发,沿作一维搜索得点,作为下一轮迭代的初始点。
xd111113)从出发,顺次沿、作一维搜索,得到点、,两点连线得一新方向: exxxd122211。
d,x,x21*22沿作一维搜索得点,即是二维问题的极小点。
xdx把二维情况的基本算法扩展到n维,则鲍威尔基本算法的要点是:在每一轮迭代中总有一个始点(第一轮的始点是任选的初始点)和n个线性独立的搜索方向。
从始点出发顺次沿n个方向作一维搜索得一终点,由始点和终点决定了一个新的搜索方向。
用这个方向替换原来n个方向中的一个,于是形成新的搜索方向组。
替换的原则是去掉原方向组的第一个方向而将新方向排在原方向的最后。
此外规定,从这一轮的搜索终点出发沿新的搜索方向作一维搜索而得到的极小点,作为下一轮迭代的始点。
这样就形成算法的循环。
图1.二维情况下的鲍威尔法二(改进算法在鲍威尔基本算法中,每一轮迭代都用连结始点和终点所产生出的搜索方向去替换原向量组中的第一个向量,而不管它的“好坏”,这是产生向量组线性相关的原因所在。
在改进的算法中首先判断原向量组是否需要替换。
如果需要替换,还要进一步判断原向量组中哪个向量最坏,然后再用新产生的向量替换这个最坏的向量,以保证逐次生成共轭方向。
function f=fun(x)f=10*(x(1)+x(2)-5)^2+(x(1)-x(2))^2; function f=fx(x0,alpha,s)x1=x0+alpha*s;f=fun(x1);function f=fsearch(x0,s)%利用进退法确定高低高区间alpha1=0;h=0.1;alpha2=alpha1+h;f1=fx(x0,alpha1,s);f2=fx(x0,alpha2,s);if f1>f2alpha3=alpha2+h;f3=fx(x0,alpha3,s);while f2>f3alpha1=alpha2;alpha2=alpha3;alpha3=alpha3+h;f2=f3;f3=fx(x0,alpha3,s);endelseh=-h;v=alpha1;alpha1=alpha2;alpha2=v;v=f1;f1=f2;f2=v;alpha3=alpha2+h;f3=fx(x0,alpha3,s);while f2>f3alpha1=alpha2;alpha2=alpha3;alpha3=alpha3+h;f2=f3;f3=fx(x0,alpha3,s);endenda=min(alpha1,alpha3);b=max(alpha1,alpha3);%利用黄金分割点法求解alpha1=a+0.382*(b-a);alpha2=a+0.618*(b-a);f1=fx(x0,alpha1,s);f2=fx(x0,alpha2,s);while abs(a-b)>0.001if f1>f2a=alpha1;alpha1=alpha2;f1=f2;alpha2=a+0.618*(b-a);f2=fx(x0,alpha2,s);elseb=alpha2;alpha2=alpha1;f2=f1;alpha1=a+0.382*(b-a);f1=fx(x0,alpha1,s);endendf=0.5*(a+b);clear%初始点x0=[0;0];%搜索方向e1=[1;0];e2=[0;1];G0=fun(x0);F0=G0;%第一次迭代%沿着e1alpha1=fsearch(x0,e1);x1=x0+alpha1*e1;F1=fun(x1);delta1=F0-F1;% 沿着方向e2;alpha2=fsearch(x1,e2);x2=x1+alpha2*e2;F2=fun(x2);G2=F2;delta2=F1-F2;deltam=max(delta1,delta2);%映射点x3=2*x2-x0;G3=fun(x3);if G3<G0 & (G0-2*G2+G3)*(G0-G2-deltam)^2<0.5*deltam*(G0-G3)^2s=x2-x0;%方向替换e1=e2;e2=s;% 沿着方向s 进行搜索alpha3=fsearch(x2,s);x3=x2+alpha2*s;x0=x3;elseif F2>G3x0=x3;elsex0=x2;endEnd子文件JT,JH进退法程序代码56555 .function [minx,maxx] = minJT(f,x0,h0,eps) format long;if nargin == 3eps = 1.0e-6;endx1 = x0;k = 0;h = h0;while 1x4 = x1 + h;k = k+1;f4 = subs(f, findsym(f),x4);f1 = subs(f, findsym(f),x1);if f4 < f1x2 = x1;x1 = x4;f2 = f1;f1 = f4;h = 2*h;elseif k==1h = -h;x2 = x4;f2 = f4;elsex3 = x2;x2 = x1;x1 = x4;break;endendendminx = min(x1,x3);maxx = x1+x3 - minx;format short;黄金分割法程序代码56555 .function [x,minf] = minHJ(f,a,b,eps) format long;if nargin == 3eps = 1.0e-6;endl = a + 0.382*(b-a);u = a + 0.618*(b-a);k=1;tol = b-a;while tol>eps && k<100000fl = subs(f , findsym(f), l);fu = subs(f , findsym(f), u);if fl > fua = l;l = u;u = a + 0.618*(b - a);elseb = u;u = l;l = a + 0.382*(b-a);endk = k+1;tol = abs(b - a);endif k == 100000disp('ÕÒ²»μ½215 ?î208 ?¡214 Oμ£¡); x = NaN;minf = NaN;return;endx = (a+b)/2;minf = subs(f, findsym(f),x);format short;。
机械优化设计程序(2009-04-24 19:30:52)转载标签:机械优化设计程序powell外点惩罚函数法c杂谈今天终于交了机械优化设计作业,程序贴出来,那位要用就拿去吧,资源共享了,O(∩_∩)O下面是利用外点惩罚函数(Powell)法求解三维目标函数最优解与最优值的程序,用C++编写。
#include<iostream.h>#include<math.h>double lamta[10]={0, 1.0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1};//鲍威尔方法初始化方向,线性无关double lamta1[3]={0, 0 , 0};//暂存新的搜索方向double x1[4]={0, 0 ,0, 0 };//x1到x3用于存储各共轭方向的点double x2[4]={0, 0 ,0, 0 };double x3[4]={0, 0 ,0, 0 };double x4[4]={0, 0 ,0, 0 };//x4用于中间判断double x5[4]={0, 0 ,0, 0 };//x5用存放于更换方向后产生的新点int m=0;//标志double x_[4]={0, 0, 0, 0};//暂存鲍威尔最优解double x0[4]={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 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<<"请输入精度"<<endl;cin>>e;changyan:Powell(r);double cmpare[4];int flag1=0;for (int i=1;i<=3;i++){cmpare[i]=x_[i]-x0[i];if (fabs(cmpare[i])<e){flag1++;}}if (flag1==3){cout<<"最优解为:"<<"x1="<<x_[1]<<" "<<"x2="<<x_[2]<<" "<<"x3="<<x_[3]<<endl;cout<<"最小值为"<<fxy(x_[1],x_[2],x_[3],r)<<endl;}else{for (int j=1;j<=3;j++){x0[j]=x_[j];}r=c*r;goto changyan;}}//子函数定义部分double fxy(double x1,double x2,double x3,double r)//待求函数{double m,n,p;m=(-x1>0)?(-x1):0;n=(-x2>0)?(-x2):0;p=(-x3>0)?(-x3):0;return //惩罚函数1000-x1*x1-2*x2*x2-x3*x3-x1*x2-x1*x3+r*(m*m+n*n+p*p)+r*((x1*x1+x2*x2+x3*x3-25)*(x1*x1+x2*x2+x3 *x3-25)+(8*x1+14*x2+7*x3-56)*(8*x1+14*x2+7*x3-56));}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:x1[i]=x0[i]+temp*lamta[n++];break;case 2:x2[i]=x1[i]+temp*lamta[n++];break;case 3:x3[i]=x2[i]+temp*lamta[n++];break;default :break;}}}double cmp[4];int flag=0;for (int i=1;i<=3;i++){cmp[i]=x3[i]-x0[i];if (fabs(cmp[i])<det){flag++;}}if (flag==3) //找到最优解x_[1]=x3[1];x_[2]=x3[2];x_[3]=x3[3];}else{double fy[4];fy[0]=fxy(x0[1],x0[2],x0[3],r);fy[1]=fxy(x1[1],x1[2],x1[3],r);fy[2]=fxy(x2[1],x2[2],x2[3],r);fy[3]=fxy(x3[1],x3[2],x3[3],r); double fyy[3]; for (int ii=0;ii<3;ii++){fyy[ii]=fy[ii]-fy[ii+1];}sort(fyy,3);for (ii=1;ii<=3;ii++){x4[ii]=2*x3[ii]-x0[ii];}double f0,f3,f4;f0=fy[0];f3=fy[3];f4=fxy(x4[1],x4[2],x4[3],r);if ((f0+f4-2*f3)/2>=fyy[2]){if (f3<f4){for (int t=1;t<=3;t++){x0[t]=x3[t];}}elsefor (int t=1;t<=3;t++){x0[t]=x4[t];}}goto my1;}else{for (int t=0;t<3;t++){lamta1[t]=x3[t+1]-x0[t+1];}m=0; //switch 标志!double aa=0,bb=0;search(aa,bb,1);double temp1;temp1=yellowcut(aa,bb);for (int i=1;i<=3;i++){x5[i]=x3[i]+temp1*lamta1[i-1];}for (i=1;i<=3;i++){x0[i]=x5[i];}for (i=1;i<=6;i++){lamta[i]=lamta[i+3];}for (i=1;i<=3;i++){lamta[6+i]=lamta1[i-1];}goto my1;}}}double ysearch(double x) //一维搜索的目标函数{switch (m){case 1: return fxy(x0[1]+x*lamta[m],x0[2]+x*lamta[m+1],x0[3]+x*lamta[m+2],r);break;case 4: return fxy(x1[1]+x*lamta[m],x1[2]+x*lamta[m+1],x1[3]+x*lamta[m+2],r);break;case 7: return fxy(x2[1]+x*lamta[m],x2[2]+x*lamta[m+1],x2[3]+x*lamta[m+2],r);break;case 0: return fxy(x3[1]+x*lamta1[0],x3[2]+x*lamta1[1],x3[3]+x*lamta1[2],r);break;//更改方向后的一维搜索default:return 0; break;}}void search(double &a,double &b,double h) //区间搜索{double a1,a2,a3,y1,y2,y3;h=1;a1=a,y1=ysearch(a1);a2=a+h,y2=ysearch(a2);if(y2>=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(h<0)a=a3,b=a1;else a=a1,b=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)<=e){xo=(a+b)/2;}elsegoto label2;return xo;}void sort(double *p,int size){//选择法排序int i,j;double k;for(i=0;i<size-1;i++)for(j=i+1;j<size;j++)if(*(p+i)>*(p+j)){k=*(p+i);*(p+i)=*(p+j);*(p+j)=k;} }。
优化设计一.建立数学模型该减速器的总中心距计算式为)]1()1([cos 2123211121i Z m i Z m a a a n n +++=+=∑β1.选取设计变量 由涉及的独立参数,取T T n n x x x x x x i Z Z m m X ],,,,,[],,,,,[65432113121==β2.建立目标函数)cos 2/()]/5.311()1([)(6542531x x x x x x x X f +++=)1(])(1)(1)(1[)()()(1721)(=+⋅⋅⋅⋅⋅⋅+++=k k r X g X g X g r X f X F3.确定约束条件(1)确定上、下限从传递功率于转速可估计 3.5≤m n1≤8 标准值(3.5, 4,5,6,8)3.5≤m n2≤10 标准值(3.5, 4,5,6,8,10)综合考虑传动平稳、轴向力不可太大,能满足短期过载,高速级与低速级大齿轮浸油深度大致相近,轴齿轮的分度圆尺寸不能太小等因素,取:14≤Z 1≤2216≤Z 3≤225.8≤i 1≤780≤β≤150由此建立12个不等式约束条件式g 1(X) = x 1 – 3.5 ≥0g 2(X) = 8 – x 1 ≥0g 3(X) = x 2 – 3.5≥0g 4(X) = 10 – x 2 ≥0g 5(X) = x 3 – 14≥0g 6(X) = 22 – x 3≥0g 7(X) = x 4 – 16≥0g 8(X) = 22 – x 4≥0g 9(X) = x 5 – 5.8≥0g 10(X) = 7 – x 5 ≥0g 11(X) = x 6 –8≥0g 12(X) = 15– x 6≥0(2)按齿面接触强度公式δH = 925a ()i + 13KT 1bi≤ [δH ],N/mm 2得到高速级和低速级齿面接触强度条件分别为[δH ]2m n13Z 13i 1ψa 8(925)2K 1T 1– cos 3β≥0 ① [δH ]2m n23Z 33i 2ψa 8(925)2K 2T 2– cos 3β≥0 ② 式中,[δH ]——许用接触应力,MpaT 1,T 2——分别为高速轴I 和中间轴II 的转矩,N ·mmK 1,K 2——分别为高速级和低速级载荷系数.(3)按轮齿弯曲强度计算公式δF1 = 1.5 K 1T 1bd 1 m n1y 1≤ [δF ]1,N ·mm 2δF2 = δF1 y 1y 2≤ [δF ]2,N ·mm 2 得到高速级和低速级大小齿轮的弯曲强度条件分别为[δF ]1ψa y 13 K 1T 1(1 + i 1) m n13Z 12 – cos 2β≥0 ③ [δF ]2ψa y 23 K 1T 1(1 + i 1) m n13Z 12 – cos 2β≥0 ④ 和 [δF ]3ψa y 33 K 2T 2(1 + i 2) m n23Z 32 – cos 2β≥0 ⑤ [δF ]4ψa y 43 K 2T 2(1 + i 2) m n23Z 32 – cos 2β≥0 ⑥ 其中[δF ]1,[δF ]2,[δF ]3,[δF ]4——分别为齿轮1,2,3,4的许用弯曲应力,N/mm 2;y 1,y 2,y 3,y 4——分别为齿轮1,2,3,4的齿形系数.(4)按高速级大齿轮与低速轴不干涉相碰的条件a 2 – E – de 2/2≥0得 m n2Z 3(1 + i 2) – 2 cos β(E + m n1) –m n1Z 1i 1≥0 ⑦ 式中E ——低速轴轴线与高速级大齿轮齿顶圆之间的距离,mm ;de 2——高速级大齿轮齿的齿顶圆直径,mm.对式①至⑦代入有关数据:[δH ] = 836 N ·mm 2[δF ]1= [δF ]3=444N ·mm ,[δF ]2= [δF ]4= 410.3N ·mm 2T 1 =144700N ·mm ,T 2 = 146789i 1 N ·mmK 1 = 1.225,K 2 = 1.204y 1=0.248,y 2=0.302,y 3=0.256,y 4=0.302E = 50mm得g 13(X) = 5.3×10-6x 13x 33x 5 – cos 3x 6 ≥0g 14(X) = 2.317×10-5x 23x 43 – x 5cos 3x 6 ≥0g 15(X) = 3.117×10-4(1 + x 5)x 13x 32 – cos 2x 6 ≥0g 18(X) = 3.422×10-5(1 + x 5)x 13x 32 – cos 2x 6 ≥0g 16(X) = 3.45×10-6(31.5 + x 5)x 23x 42 – x 52cos 2x 6 ≥0g 19(X) = 3.32×10-5(31.5 + x 5)x 23x 42 – x 52cos 2x 6 ≥0g 17(X) = x 2x 4 (31.5 + x 5) – 2x 5cos x 6 (x 1+50) –x 1x 3x 52≥0g 18(X)、g 19(X)和g 15(X)、g 16(X)相比为明显的消极约束,可省略。
机械优化设计鲍威尔法
机械优化设计鲍威尔法(Powell method)是一种常用的非线性优化
算法,它以鲍威尔的名字命名,用于解决无约束非线性优化问题。
该方法
在各个领域都有广泛的应用,如工程优化设计、机器学习等。
下面将详细
介绍机械优化设计鲍威尔法的原理及应用。
鲍威尔法的具体步骤如下:
1.初始化参数:选择初始设计参数和方向。
2.寻找一维极小值点:沿着方向找到目标函数在该方向上的极小值点。
3.更新方向:通过比较前后两个极小值点的差异来更新方向。
4.迭代优化:重复步骤2和步骤3,直到达到指定的收敛条件。
鲍威尔法的优点是收敛速度较快、计算量较小,同时可以处理非线性
的优化问题。
然而,该方法也存在一些不足之处,如可能陷入局部最优解、对初值敏感等。
机械优化设计鲍威尔法在工程领域中有广泛的应用。
例如,在机械结
构设计中,可以利用鲍威尔法来优化结构参数,以满足特定的性能指标。
在汽车工业中,可以使用鲍威尔法来优化车辆的燃油效率和性能。
在航空
航天领域,可以利用该方法来优化飞行器的飞行性能。
此外,该方法还可
以用于机器学习中的参数优化,如调整神经网络的权重和偏置等。
总之,机械优化设计鲍威尔法是一种常用的非线性优化算法,通过迭
代逼近最优解。
虽然该方法有一些不足之处,但在实际应用中具有广泛的
适用性,尤其在工程优化设计和机器学习等领域。
通过使用该方法,可以
优化设计参数,改进性能指标,提高工程效率和产品质量。
鲍威尔法求解二维函数极小值的程序说明一 题目利用鲍威尔法求函数221212112(,)242f x x x x x x x =+--的极小值点。
二 鲍威尔法基本思想:1) 给定初始点0x ,选取初始方向组,它由n 各线性无关的向量00012,...n d d d 所组成。
2) 从0k x 出发,顺次沿12,,...k k k n d d d 作一维搜索得12,,...k k k n x x x 。
接着以k n x 为起点,沿方向10k k k n n d x x +=-移动一个0k k n x x -的距离,得到 01,,k k k n n x x x +分别称为一轮迭代的始点,终点和反射点。
始点,终点,反射点所对应的函数值分别表示为同时计算各中间点处的函数值,并记为因此有002,n F f F f ==计算n 个函数值之差,记作1i i i f f -∆=-其中最大者记作1max m i m m f f -∆=∆=-3) 根据是否满足判别条件和来确定是否要对原方向组进行替换。
若不满足判别条件,则下轮迭代应对原方向组进行替换,将1k n d +补充到原方向组的最后位置,而除掉k m d 。
即新方向组为1k d ,2k d ,…,1k m d -,1k m d +,…,k n d ,1kn d +作为下轮迭代的搜索方向。
下轮迭代的始点取1k n d +方向进行一维搜索得极小点10k x +。
4) 判断是否满足收敛准则。
若满足则取10k x +为极小点,否则应置1k k =+,返回2,继续 进行下一轮迭代。
改进后的鲍威尔法程序框图如下:三用鲍威尔法求函数程序如下:"#include "鲍威尔法"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif." menu item to system menu.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;(IDS_ABOUTBOX);if (!()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}The framework does this automaticallyFor MFC applications using the document/view model,void CMyDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::OnOK(){// TODO: Add extra validation here//CDialog::OnOK();UpdateData(true);int i,n;double h1,h2,h3,m,flag,X00[2][1],d01[2][1],d02[2][1],d03[2][1]; //确定键的执行程序double X01[2][1],X02[2][1],X03[2][1];double F0,F1,F2,F3,e1,e2,em;double X[2][1];double f0,f1,f2,f3;X00[0][0]=m_x01; //对初始搜索点进行赋值X00[1][0]=m_x02;d01[0][0]=1,d01[1][0]=0; //初始索索方向的确定d02[0][0]=0,d02[1][0]=1;i=1;do{F0=(X00[0][0]*X00[0][0]+2*X00[1][0]*X00[1][0]-4*X00[0][0]-2*X00[0][0]*X00[1][0]),f0=F0; //初始点函数值h1=(4*d01[0][0]+2*d01[0][0]*X00[1][0]+2*d01[1][0]*X00[0][0])/(2*d01[0][0]*d01[0][0]+ //确定搜索方向4*d01[1][0]*d01[1][0]-4*d01[1][0]*d01[0][0]);X01[0][0]=X00[0][0]+h1*d01[0][0],X01[1][0]=X00[1][0]+h1*d01[1][0];F1=(X01[0][0]*X01[0][0]+2*X01[1][0]*X01[1][0]-4*X01[0][0]-2*X01[0][0]*X01[1][0]),f1=F1; //确定F的函数值h2=(4*d02[0][0]+2*d02[0][0]*X01[1][0]+2*d02[1][0]*X01[0][0])/(2*d02[0][0]*d02[0][0]+ //确定搜索步长4*d02[1][0]*d02[1][0]-4*d02[1][0]*d02[0][0]);X02[0][0]=X01[0][0]+h2*d02[0][0] ;X02[1][0]=X01[1][0]+h2*d02[1][0];F2=(X02[0][0]*X02[0][0]+2*X02[1][0]*X02[1][0]-4*X02[0][0]-2*X02[0][0]*X02[1][0]),f2=F2;//确定F2的函数值e1=f0-f1; //进行判定e2=f1-f2;if(e1>e2) em=e1,m=1;else em=e2,m=2;//////////////////////////////////////////////////////////////////////////////d03[0][0]=X02[0][0]-X00[0][0];d03[1][0]=X02[1][0]-X00[1][0];X03[0][0]=2*X02[0][0]-X00[0][0];X03[1][0]=2*X02[1][0]-X00[1][0];F3=(X03[0][0]*X03[0][0]+2*X03[1][0]*X03[1][0]-4*X03[0][0]-2*X03[0][0]*X03[1][0]),f3=F3; //确定F3的函数值while (F3>=F0 && (F0-2*F2+F3)*(F0-F2-em)*(F0-F2-em)>=*(F0-F3)*(F0-F3)) //不满足判别条件{i++;if (F2<F3){X00[0][0]=X02[0][0],X00[1][0]=X02[1][0];//以函数最小者作为下轮迭代的始点F0=(X00[0][0]*X00[0][0]+2*X00[1][0]*X00[1][0]-4*X00[0][0]-2*X00[0][0]*X00[1][0]),f0=F0;//进行第二轮搜索h1=(4*d01[0][0]+2*d01[0][0]*X00[1][0]+2*d01[1][0]*X00[0][0])/(2*d01[0][0]*d01[0][0]+ //确定步长4*d01[1][0]*d01[1][0]-4*d01[1][0]*d01[0][0]);X01[0][0]=X00[0][0]+h1*d01[0][0],X01[1][0]=X00[1][0]+h1*d01[1][0];F1=(X01[0][0]*X01[0][0]+2*X01[1][0]*X01[1][0]-4*X01[0][0]-2*X01[0][0]*X01[1][0]),f1=F1;//确定函数值h2=(4*d02[0][0]+2*d02[0][0]*X01[1][0]+2*d02[1][0]*X01[0][0])/(2*d02[0][0]*d02[0][0]+//确定步长4*d02[1][0]*d02[1][0]-4*d02[1][0]*d02[0][0]);X02[0][0]=X01[0][0]+h2*d02[0][0] ;X02[1][0]=X01[1][0]+h2*d02[1][0];F2=(X02[0][0]*X02[0][0]+2*X02[1][0]*X02[1][0]-4*X02[0][0]-2*X02[0][0]*X02[1][0]),f2=F2;//确定函数值e1=f0-f1;e2=f1-f2;if(e1>e2) em=e1,m=1; //进行判断else em=e2,m=2;d03[0][0]=X02[0][0]-X00[0][0]; //确定新的搜索方向d03[1][0]=X02[1][0]-X00[1][0];X03[0][0]=2*X02[0][0]-X00[0][0];X03[1][0]=2*X02[1][0]-X00[1][0];F3=(X03[0][0]*X03[0][0]+2*X03[1][0]*X03[1][0]-4*X03[0][0]-2*X03[0][0]*X03[1][0]),f3=F3;//确定函数值}else{X00[0][0]=X03[0][0],X00[1][0]=X03[1][0];F0=(X00[0][0]*X00[0][0]+2*X00[1][0]*X00[1][0]-4*X00[0][0]-2*X00[0][0]*X00[1][0]),f0 =F0;h1=(4*d01[0][0]+2*d01[0][0]*X00[1][0]+2*d01[1][0]*X00[0][0])/(2*d01[0][0]*d01[0][0] +4*d01[1][0]*d01[1][0]-4*d01[1][0]*d01[0][0]);X01[0][0]=X00[0][0]+h1*d01[0][0],X01[1][0]=X00[1][0]+h1*d01[1][0];F1=(X01[0][0]*X01[0][0]+2*X01[1][0]*X01[1][0]-4*X01[0][0]-2*X01[0][0]*X01[1][0]),f1 =F1;h2=(4*d02[0][0]+2*d02[0][0]*X01[1][0]+2*d02[1][0]*X01[0][0])/(2*d02[0][0]*d02[0][0] +4*d02[1][0]*d02[1][0]-4*d02[1][0]*d02[0][0]);X02[0][0]=X01[0][0]+h2*d02[0][0] ;X02[1][0]=X01[1][0]+h2*d02[1][0];F2=(X02[0][0]*X02[0][0]+2*X02[1][0]*X02[1][0]-4*X02[0][0]-2*X02[0][0]*X02[1][0]),f2 =F2;e1=f0-f1;e2=f1-f2;if(e1>e2) em=e1,m=1;else em=e2,m=2;d03[0][0]=X02[0][0]-X00[0][0];d03[1][0]=X02[1][0]-X00[1][0];X03[0][0]=2*X02[0][0]-X00[0][0];X03[1][0]=2*X02[1][0]-X00[1][0];F3=(X03[0][0]*X03[0][0]+2*X03[1][0]*X03[1][0]-4*X03[0][0]-2*X03[0][0]*X03[1][0]),f3 =F3;}}if(m=1) d01[0][0]=d03[0][0],d01[1][0]=d03[1][0];else{if(m=2)d02[0][0]=d03[0][0],d02[1][0]=d03[1][0];}h3=(4*d03[0][0]+2*d03[0][0]*X02[1][0]+2*d03[1][0]*X02[0][0])/(2*d03[0][0]*d03[0][0] +4*d03[1][0]*d03[1][0]-4*d03[1][0]*d03[0][0]);X00[0][0]=X02[0][0]+h3*d03[0][0];X00[1][0]=X02[1][0]+h3*d03[1][0];if(i=2) break;} while (abs(X02[0][0]-X00[0][0])>&&abs(X02[1][0]-X00[1][0])>;//输出极小值点X[0][0]=X00[0][0],X[1][0]=X00[1][0];m_x1=X[0][0];m_x2=X[1][0];UpdateData(false);}程序运行结果:四结论由该程序的运行结果可知,要求函数的极小值的在(10,5)处。
机械优化设计鲍威尔法编程鲍威尔法编程,又称行进法、射线法,是一种无约束极值问题的最优化算法。
其核心思想是通过不断更新方向,寻找函数极小值点。
鲍威尔法编程结合了线和模式的特点,具有全局能力和局部能力,因此在机械优化设计中得到广泛应用。
在机械优化设计中,通常需要考虑多个设计参数对机械性能的影响。
鲍威尔法编程可以通过不断迭代的方式,寻找最佳的设计参数组合,以达到设计要求。
其具体步骤如下:1.初始化设计参数和步长。
2.计算当前设计参数下的目标函数值。
3.在当前方向上进行线,找到使目标函数值下降的步长。
4.更新设计参数,将方向和步长相乘加到当前设计参数上。
5.检查当前设计参数的变化是否满足终止条件,如果满足则结束,否则返回步骤26.返回最佳设计参数组合及对应的目标函数值。
下面以一个简单的机械优化设计案例为例进行详细说明。
假设有一个弹簧悬挂系统,需要设计合适的弹簧刚度和阻尼系数来满足特定的振动要求。
目标函数为最小化系统振动幅值。
首先,需要定义设计参数和目标函数。
设计参数可以选择弹簧刚度和阻尼系数。
目标函数可以定义为系统振动幅值的平方。
其次,需要确定方向和初始步长。
对于弹簧刚度和阻尼系数来说,方向可以选择正方向和负方向。
初始步长可以根据经验或试验来确定。
然后,根据鲍威尔法编程的步骤,进行迭代。
首先,初始化设计参数和步长。
然后,计算当前设计参数下的目标函数值。
接下来,根据当前方向和步长进行线,找到使目标函数值下降的步长。
再更新设计参数,将方向和步长相乘加到当前设计参数上。
最后,检查当前设计参数的变化是否满足终止条件,如果满足则结束,否则返回到线步骤继续。
最后,得到最佳的设计参数组合及对应的目标函数值。
可以根据实际情况进行设计参数的调整和优化,以获得更好的机械性能。
总之,鲍威尔法编程是一种常用的机械优化设计方法。
通过不断迭代的方式,寻找最佳的设计参数组合,以满足设计要求。
其原理和步骤相对简单,但需要结合具体问题进行参数的选择和调整。
机械优化设计程序设计组员:完成时间:2013年5月12日目录:1.1 进退法............................................................................................... - 4 -1.1.1进退法的原理和流程图.................................................................. - 4 -1.1.2进退法程序代码............................................................................. - 5 -1.1.3程序的调试及运行结果.................................................................. - 6 - 1.2 黄金分割............................................................................................. - 7 -1.2.1黄金分割法的原理和流程图........................................................... - 7 -1.2.2黄金分割法的程序代码.................................................................. - 7 -1.2.3程序的调试及运行结果.................................................................. - 9 - 1.3 二次插值 ......................................................................................... - 10 -1.3.1 二次插值确定搜索区间的原理和流程图...................................... - 10 -1.3.2二次插值的程序代码 ................................................................... - 11 -1.3.3程序的调试及运行结果................................................................ - 13 - 1.4 牛顿型法........................................................................................... - 14 -1.4.1牛顿型法的求极值的原理及其流程图 .......................................... - 14 -1.4.2牛顿型法的程序代码 ................................................................... - 16 -1.4.3程序的调试及运行结果................................................................ - 18 - 1.5 鲍威尔法 ......................................................................................... - 19 -1.5.1鲍威尔法的流程图....................................................................... - 19 -1.5.2鲍威尔法的程序代码 ................................................................... - 20 -1.5.3程序的调试及运行结果................................................................ - 23 - 1.6 复合型法........................................................................................... - 24 -1.6.1复合型法的求极值的原理及其流程图 .......................................... - 24 -1.6.2复合型法的程序代码 ................................................................... - 25 -1.6.3程序的调试及运行结果................................................................ - 31 - 1.7 内点惩罚函数法 ................................................................................ - 31 -1.7.1内点惩罚函数法的求极值的原理及其流程图................................ - 31 -1.7.2内点惩罚函数法的程序代码......................................................... - 32 -1.7.3程序的调试及运行结果................................................................ - 35 -2.1 圆柱齿轮减速器的优化计算 .............................................................. - 35 -2.1.1圆柱齿轮减速器优化问题的背景.................................................. - 35 -2.1.2圆柱齿轮减速器的优化设计......................................................... - 36 -2.1.2.1目标函数的确定 .................................................................. - 36 -2.1.2.2约束条件的确定 .................................................................. - 38 -2.1.3求解优化问题的程序代码 ............................................................ - 41 -2.1.4程序的调试及运行结果................................................................ - 43 -3.1体会及建议.......................................................................................... - 44 -附录........................................................................................................... - 45 -(1)fmincon函数 ......................................................................................... - 45 -1.1 进退法1.1.1进退法的原理和流程图进退法是用来确定搜索区间(包含极小值点的区间)的算法,其理论依据是:()f x 为单谷函数(只有一个极值点),且[,]a b 为其极小值点的一个搜索区间,对12,[,]x x a b ,于任意如果图1-1进退法程序框图()()12f x f x <,则2[,]a x 为极小值的搜索区间,如果()()12f x f x >,则1[,]x b 为极小值的搜索区间。
优化设计-鲍威尔法程序(c语言)#include<tdio.h>#include<math.h>#definem10/某数组长度m>=维数n某/floatf(float某[]);voidmjtf(intn,float某0[],floath,float[],floata[],floatb[]);voidmhjfgf(intn,floata[],floatb[],floatflag,float某[]);voidmbwef(intn,float某0[],floath,floatflag,floata[],floatb[],float某[]);floatf(float某[]){floatreult;reult=60-10某某[0]-4某某[1]+某[0]某某[0]+某[1]某某[1]-某[0]某某[1];returnreult;}/某多维进退法子程序某/voidmjtf(intn,float某0[],floath,float[],floata[],floatb[]) {inti;float某1[m],某2[m],某3[m],f1,f2,f3; for(i=0;i<n;i++)/某计算初始两试点某/ {某1[i]=某0[i];某2[i]=某0[i]+h某[i];}f1=f(某1);f2=f(某2);if(f2>=f1)/某判断搜索方向某/{/某搜索方向为反向,转身某/h=(-1)某h;for(i=0;i<n;i++)某3[i]=某1[i];f3=f1;for(i=0;i<n;i++)某1[i]=某2[i];f1=f2;for(i=0;i<n;i++)某2[i]=某3[i];f2=f3;}/某搜索方向为正向某/for(i=0;i<n;i++)/某计算第三试点某/某3[i]=某2[i]+h某[i];f3=f(某3);while(f3<f2)/某判断是否未完成搜索某/ {/某未完成,继续搜索某/h=2某h;for(i=0;i<n;i++)某1[i]=某2[i];f1=f2;for(i=0;i<n;i++)某2[i]=某3[i];f2=f3;for(i=0;i<n;i++)某3[i]=某2[i]+h某[i];f3=f(某3);}/某已完成某/for(i=0;i<n;i++)/某输出初始搜索区间某/{if(某1[i]<某3[i]){a[i]=某1[i];b[i]=某3[i];}ele{a[i]=某3[i];b[i]=某1[i];}}}/某多维黄金分割法子程序某/voidmhjfgf(intn,floata[],floatb[],floatflag,float某[]) {inti;float某1[m],某2[m],f1,f2,um;for(i=0;i<n;i++)/某计算初始两试点某/某1[i]=b[i]-(float)0.618某(b[i]-a[i]); f1=f(某1);for(i=0;i<n;i++)某2[i]=a[i]+(float)0.618某(b[i]-a[i]); f2=f(某2);do{if(f1<=f2)/某判断消去区间某/{/某消去右某/for(i=0;i<n;i++)b[i]=某2[i];for(i=0;i<n;i++)某2[i]=某1[i];f2=f1;for(i=0;i<n;i++)某1[i]=b[i]-(float)0.618某(b[i]-a[i]); f1=f(某1);}ele{/某消去左某/for(i=0;i<n;i++)a[i]=某1[i];for(i=0;i<n;i++)某1[i]=某2[i];f1=f2;for(i=0;i<n;i++)某2[i]=a[i]+(float)0.618某(b[i]-a[i]); f2=f(某2);}um=0;for(i=0;i<n;i++)um+=(b[i]-a[i])某(b[i]-a[i]);}while(qrt(um)>flag某0.1);for(i=0;i<n;i++)某[i]=(float)0.5某(b[i]+a[i]);}/某鲍威尔法子程序某/voidmbwef(intn,float某0[],floath,floatflag,floata[],floatb[],float某[]){ inti,j,k,r;float某1[m],某2[m],f0,f1,f2,fn[m],[m][m],um;for(i=0;i<n;i++)for(k=0;k<n;k++)if(i==k)[i][k]=1;ele[i][k]=0;k=1;while(1){for(i=0;i<n;i++)某1[i]=某0[i];for(i=0;i<n;i++)mjtf(n,某1,h,[i],a,b);mhjfgf(n,a,b,flag,某1);fn[i]=f(某0)-f(某1);}for(i=0;i<n;i++)某2[i]=2某某1[i]-某0[i];for(i=1;i<n;i++)if(fn[0]<fn[i]){fn[0]=fn[i];r=i;}eler=0;f0=f(某0);f1=f(某1);f2=f(某2);if(f2>=f0||(f0-2某f1+f2)某(f0-f1-fn[0])某(f0-f1-fn[0])>=0.5某fn[0]某(f0-f2)某(f0-f2)){um=0;for(i=0;i<n;i++)um+=(某1[i]-某0[i])某(某1[i]-某0[i]);if(f1<=f2)for(i=1;i<n;i++)某0[i]=某1[i];elefor(i=1;i<n;i++)某0[i]=某2[i];}ele{for(i=r;i<n;i++)for(j=0;j<n;j++)[i][j]=[i+1][j];for(i=0;i<n;i++)[n][i]=某1[i]-某0[i];mjtf(n,某1,h,[n],a,b);mhjfgf(n,a,b,flag,某1);um=0;for(i=0;i<n;i++)um+=(某1[i]-某0[i])某(某1[i]-某0[i]);for(i=0;i<n;i++)某0[i]=某1[i];if(qrt(um)<=flag)break;elek+=1;}for(i=0;i<n;i++)某[i]=某1[i];}/某鲍威尔法主程序某/voidmain(){inti,n;floath,flag,某0[m],a[m],b[m],某[m];printf("\n<鲍威尔法>\n");printf("请输入维数:\n");canf("%d",&n);printf("请输入初始点:");for(i=0;i<n;i++){printf("\n某0[%d]=",i);canf("%f",&某0[i]);}printf("\n请输入初始步长:\n");canf("%f",&h);printf("\n请输入精度:\n");canf("%f",&flag);mbwef(n,某0,h,flag,a,b,某);printf("\n极小点坐标为:\n");for(i=0;i<n;i++)printf("某[%d]=%f\n",i,某[i]);printf("\n极小值为:\n%f\n",f(某));}。
机械优化设计鲍威尔法编程
鲍威尔法(Powell's method)是一种常用于机械优化设计的迭代算法,它基于步长的方向进行,进而找到局部或全局最优解。
该算法主要用于解决无约束优化问题,即不涉及约束条件的优化设计。
下面将详细介绍鲍威尔法的编程实现。
鲍威尔法的基本思路是在迭代过程中通过多次步长方向,找到全局最优解。
具体步骤如下:
1.初始化:设置初始点x0和迭代次数k=0。
2.计算方向:选择一个初始的方向d0和步长α,并将d0归一化为单位向量。
3. 求解新的迭代点:通过计算当前点xk加上步长α乘以方向dk,得到新的迭代点xk+1
4. 更新方向:计算新的方向dk+1
5. 判断是否达到终止条件:如果达到了终止条件,则输出当前点
xk+1为最优解;否则,令k=k+1,返回第3步继续进行迭代。
下面给出一个使用Python编程实现鲍威尔法的示例代码:
```python
import numpy as np
def powell_method(f, x0, alpha, eps, max_iter):
#初始化
x=x0
d = np.eye(len(x0))
k=0
while k < max_iter:
#计算方向和步长
g=f(x)
d_norm = np.linalg.norm(d, axis=0) d = d / d_norm
alpha = alpha / d_norm
#求解新的迭代点
x_new = x + alpha * d
#更新方向
g_new = f(x_new)
delta = g_new - g
d = np.roll(d, -1, axis=0)
d[-1] = (x_new - x) / alpha
#判断终止条件
if np.linalg.norm(delta) < eps: return x_new
#更新迭代点
x = x_new
k+=1
return x
#示例函数,目标是求解f(x)=(x[0]-1)^2+(x[1]-2)^2 def f(x):
return (x[0] - 1) ** 2 + (x[1] - 2) ** 2
#设置初始点、步长、终止条件和最大迭代次数
x0 = np.array([0.0, 0.0])
alpha = 0.1
eps = 1e-6
max_iter = 100
#调用鲍威尔法进行优化设计
x_opt = powell_method(f, x0, alpha, eps, max_iter) #输出最优解
print("Optimal solution: ", x_opt)
print("Optimal value: ", f(x_opt))
```
在上述代码中,目标函数f(x)为示例函数,可以根据具体的优化设
计问题进行修改。
初始点x0、步长alpha、终止条件eps和最大迭代次数max_iter可以根据具体情况进行设置。
最后输出的最优解(即x_opt)为
算法找到的优化设计结果。
需要注意的是,鲍威尔法并不能保证找到全局最优解,而只能找到局
部最优解。
如果需要全局优化设计,可以考虑使用其他算法,如遗传算法、粒子群算法等。
同时,在实际应用中,还需要根据具体问题对算法进行调
参和优化,以获得更好的优化设计结果。