收藏 分销(赏)

2023年优化方法上机大作业.doc

上传人:快乐****生活 文档编号:3258758 上传时间:2024-06-27 格式:DOC 页数:38 大小:312.04KB 下载积分:12 金币
下载 相关
2023年优化方法上机大作业.doc_第1页
第1页 / 共38页
2023年优化方法上机大作业.doc_第2页
第2页 / 共38页


点击查看更多>>
资源描述
优化措施 上机大作业 机械工程与材料能源学部 能源与动力学院 能源与环境工程 联络方式: x0=[0;1]T;%初始值 s0=[-1;1]T;%初始搜索方向 c1=0.1;c2=0.5;a=0;b=inf;d=1;n=0; x1=x0+d*s0; g0=[(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));(x0(2)-x0(1)^2)]; g1=[(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));(x1(2)-x1(1)^2)]; f1=(x1(2)-x1(1)^2)^2+(1-x1(1))^2; f0=(x0(2)-x0(1)^2)^2+(1-x0(1))^2; while((f0-f1<-c1*d*g0'*s0)||(g1'*s0<c2*g0'*s0)) if ((f0-f1)<(-c1*d*g0'*s0)) b=d;d=(d+a)/2; x1=x0+d*s0; g0=[(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));(x0(2)-x0(1)^2)]; g1=[(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));(x1(2)-x1(1)^2)]; f1=(x1(2)-x1(1)^2)^2+(1-x1(1))^2; f0=(x0(2)-x0(1)^2)^2+(1-x0(1))^2; elseif (((g1')*s0)<(c2*(g0')*s0)) a=d; if(2*d<=(d+b)/2) d=2*d; else d=(d+b)/2; end x1=x0+d*s0; g0=[(x0(2)-x0(1)^2)*x0(1)-2*(1-x0(1));(x0(2)-x0(1)^2)]; g1=[(x1(2)-x1(1)^2)*x1(1)-2*(1-x1(1));(x1(2)-x1(1)^2)]; f1=(x1(2)-x1(1)^2)^2+(1-x1(1))^2; f0=(x0(2)-x0(1)^2)^2+(1-x0(1))^2; end end x1 f1=(x1(2)-x1(1)^2)^2+(1-x1(1))^2 x1 = -0.0000 1.0000 d = 1.1102e-016 f1 = 2 function f = fun( x ) %UNTITLED3 Summary of this function goes here % Detailed explanation goes here f=x(1)^2-2*x(1)*x(2)+2*x(2)^2+x(3)^2+x(4)^2-x(2)*x(3)+2*x(1)+3*x(2)-x(3); End function g = fun( x ) %UNTITLED4 Summary of this function goes here % Detailed explanation goes here g=[2 -2 0 0;-2 4 -1 0;0 -1 2 0;0 0 0 2]*x+[2;3;-1;0]; end x0=[0;0;0;0]; %初始值 eps=1.0e-4; %精度 g0=gfun(x0); s0=-g0; n=0; syms d1; while norm(g0)>eps if n<3 g=gfun(x0+d1*s0); d= double(solve(s0'*g)); x1=x0+d*s0; g1=gfun(x1); if norm(g1)<eps n=n+1; x0=x1; break else s0=-g1+(norm(g1)^2/norm(g0)^2)*s0; x0=x1; g0=g1; end elseif n=3 x0=x1; g0=gfun(x0); s0=-g0; n=0; end n=n+1; end x0 n fun(x0) x0 = -4 -3 -1 0 n = 3 ans = -8 function f= fun3_1(x ) %FUN3 Summary of this function goes here % Detailed explanation goes here f=x(1)+2*x(2)^2+exp(x(1)^2+x(2)^2); end function g= gfun3_1(x) %GFUN3_1 Summary of this function goes here % Detailed explanation goes here g=[1+2*x(1)*exp(x(1)^2+x(2)^2);4*x(2)+2*x(2)*exp(x(1)^2+x(2)^2)]; end (1) 最速下降法 x0=[0;1];%初始值 eps=1.0e-5;%精度 n=0; g0=gfun3_1(x0); syms d1; while norm(g0)>=eps s0=-g0; g=gfun3_1(x0+d1*s0); d= double(solve(s0'*g)); x1=x0+d*s0; g1=gfun3_1(x1); if( norm(g1)<eps) n=n+1; x0=x1; break; else x0=x1; g0=gfun3_1(x0); end n=n+1; end f0=fun3_1(x0) x0 n f0 = 0.7729 x0 = -0.4194 0.0000 n = 6 (2)牛顿法 function g2 = hesse(x) %HESSE Summary of this function goes here % Detailed explanation goes here g2=[2*exp(x(1)^2+x(2)^2)+4*x(1)^2*exp(x(1)^2+x(2)^2),4*x(1)*x(2)*exp(x(1)^2+x(2)^2) 4*x(1)*x(2)*exp(x(1)^2+x(2)^2),4+2*exp(x(1)^2+x(2)^2)+4*x(2)^2*exp(x(1)^2+x(2)^2)]; end x0=[0;1];%初始值 eps=1.0e-5;%精度 n=0; g0=gfun3_1(x0); g20=hesse(x0); while norm(g0)>=eps d=-g20\g0; x1=x0+d; g1=gfun3_1(x1); if( norm(g1)<eps) n=n+1; x0=x1; break; else x0=x1; g0=gfun3_1(x0); end n=n+1; end f0=fun3_1(x0) x0 n f0 = 0.7729 x0 = -0.4194 0.0000 n = 35 (3)BFGS x0=[0;1];%初始值 eps=1.0e-5;%精度 n=0; g0=gfun3_1(x0); syms d1; h0=eye(2); while norm(g0)>=eps s0=-h0*g0; g=gfun3_1(x0+d1*s0); d= double(solve(s0'*g)); x1=x0+d*s0; g1=gfun3_1(x1); if( norm(g1)<eps) n=n+1; x0=x1; break; else h0=h0-(h0*(g1-g0)*(g1-g0)'*h0)/((g1-g0)'*h0*(g1-g0))+... ((x1-x0)*(x1-x0)')/((x1-x0)'*(g1-g0))+... ((g1-g0)'*h0*(g1-g0))*((x1-x0)*(x1-x0)'); x0=x1; g0=gfun3_1(x0); end n=n+1; end f0=fun3_1(x0) x0 n f0 = 0.7729 x0 = -0.4194 0.0000 n = 4 function[x,lamk,exitflag,output]=qpact(H,c,Ae,be,Ai,bi,x0) epsilon=1.0e-9; err=1.0e-6; k=0; x=x0; n=length(x); kmax=1.0e3; ne=length(be); ni=length(bi); lamk=zeros(ne+ni,1); index=ones(ni,1); for (i=1:ni) if(Ai(i,:)*x>bi(i)+epsilon), index(i)=0; end end while (k<=kmax) Aee=[ ]; if(ne>0), Aee=Ae; end for(j=1:ni) if(index(j)>0), Aee=[Aee; Ai(j,:)]; end end gk=H*x+c; [m1,n1] = size(Aee); [dk,lamk]=qsubp(H,gk,Aee,zeros(m1,1)); if(norm(dk)<=err) y=0.0; if(length(lamk)>ne) [y,jk]=min(lamk(ne+1:length(lamk))); end if(y>=0) exitflag=0; else exitflag=1; for(i=1:ni) if(index(i) & (ne+sum(index(1:i)))==jk) index(i)=0; break; end end end k=k+1; else exitflag=1; alpha=1.0; tm=1.0; for(i=1:ni) if((index(i)==0)&(Ai(i,:)*dk<0)) tm1=(bi(i)-Ai(i,:)*x)/(Ai(i,:)*dk); if(tm1<tm) tm=tm1; ti=i; end end end alpha=min(alpha,tm); x = x+alpha*dk; if(tm<1), index(ti)=1; end end if(exitflag==0), break; end k=k+1; end output.fval=0.5*x'*H*x+c'*x; output.iter=k; function [x,lambda]=qsubp(H,c,Ae,be) ginvH=pinv(H); [m,n]=size(Ae); if (m>0) rb = Ae*ginvH*c + be; lambda = pinv(Ae*ginvH*Ae')*rb; x = ginvH*(Ae'*lambda-c); else x = -ginvH*c; lambda = zeros(m,1); end callqpact.m文献 function callqpact H=[2 0; 0 2]; c=[-2 -5]'; Ae=[ ]; be=[ ]; Ai=[1 -2; -1 -2; -1 2;1 0;0 1]; bi=[-2 -6 -2 0 0]'; x0=[0 0]'; [x, lambda, exitflag,output]=qpact(H,c,Ae,be,Ai,bi,x0) 运行成果: callqpact x = 1.4000 1.7000 lambda = 0.8000 exitflag = 0 output = fval: -6.4500 iter: 7 Function [x,mu,lambda,output]=multphr(fun,hf,gf,dfun,dhf,dgf,x0) function psi=mpsi(x,fun,hf,gf,dfun,dhf,dgf,mu,lambda,sigma) function he=h1(x) he=-x(1)^2-x(2)^2+25.0; function f=f1(x) f=4*x(1)-x(2)^2-12; function gi=g1(x) gi=10*x(1)-x(1)^2+10*x(2)-x(2)^2-34; function dhe = dh1(x) dhe = [-1*x(1), -1*x(2)]'; function dgi = dg1(x) dgi = [10-2*x(1), 10-2*x(2)]'; function g=df1(x) g = [4, -2.0*x(2)]'; function [x,val,k]=bfgs(fun,gfun,x0,varargin) maxk=500; sigma=2.0; eta=2.0; theta=0.8; k=0; ink=0; epsilon=1e-5; x=x0; he=feval(hf,x); gi=feval(gf,x); n=length(x); l=length(he); m=length(gi); mu=0.1*ones(l,1); lambda=0.1*ones(m,1); btak=10; btaold=10; while(btak>epsilon & k<maxk) [x,ival,ik]=bfgs('mpsi','dmpsi',x0,fun,hf,gf,dfun,dhf,dgf,mu,lambda,sigma); ink=ink+ik; he=feval(hf,x); gi=feval(gf,x); btak=0.0; for (i=1:l), btak=btak+he(i)^2; end for i=1:m temp=min(gi(i),lambda(i)/sigma); btak=btak+temp^2; end btak=sqrt(btak); if btak>epsilon if(k>=2 & btak > theta*btaold) sigma=eta*sigma; end for (i=1:l), mu(i)=mu(i)-sigma*he(i); end for (i=1:m) lambda(i)=max(0.0,lambda(i)-sigma*gi(i)); end end k=k+1; btaold=btak; x0=x; end f=feval(fun,x); output.fval=f; output.iter=k; output.inner_iter=ink; output.bta=btak; f=feval(fun,x); he=feval(hf,x); gi=feval(gf,x); l=length(he); m=length(gi); psi=f; s1=0.0; for(i=1:l) psi=psi-he(i)*mu(i); s1=s1+he(i)^2; end psi=psi+0.5*sigma*s1; s2=0.0; for(i=1:m) s3=max(0.0, lambda(i) - sigma*gi(i)); s2=s2+s3^2-lambda(i)^2; end psi=psi+s2/(2.0*sigma); maxk=500; rho=0.55; sigma1=0.4; epsilon1=1e-5; k=0; n=length(x0); Bk=eye(n); while(k<maxk) gk=feval(gfun,x0,varargin{:}); if(norm(gk)<epsilon1), break; end dk=-Bk\gk; m=0; mk=0; while(m<20) newf=feval(fun,x0+rho^m*dk,varargin{:}); oldf=feval(fun,x0,varargin{:}); if(newf<oldf+sigma1*rho^m*gk'*dk) mk=m; break; end m=m+1; end x=x0+rho^mk*dk; sk=x-x0; yk=feval(gfun,x,varargin{:})-gk; if(yk'*sk>0) Bk=Bk-(Bk*sk*sk'*Bk)/(sk'*Bk*sk)+(yk*yk')/(yk'*sk); end k=k+1; x0=x; end val=feval(fun,x0,varargin{:}); function dpsi=dmpsi(x,fun,hf,gf,dfun,dhf,dgf,mu,lambda,sigma) dpsi=feval(dfun,x); he=feval(hf,x); gi=feval(gf,x); dhe=feval(dhf,x); dgi=feval(dgf,x); l=length(he); m=length(gi); for(i=1:l) dpsi=dpsi+(sigma*he(i)-mu(i))*dhe(:,i); end for(i=1:m) dpsi=dpsi+(sigma*gi(i)-lambda(i))*dgi(:,i); end >> x0=[1,1]'; [x,mu,lambda,output]=multphr('f1','h1','g1','df1','dh1','dg1',x0) x = 1.0013 4.8987 mu = 2.0312 lambda = 0.7545 output = fval: -31.9923 iter: 5 inner_iter: 58 bta: 4.3187e-07 function [x,mu,lam,val,k]=sqpm(x0,mu0,lam0) maxk=100; n=length(x0); l=length(mu0); m=length(lam0); rho=0.5; eta=0.1; B0=eye(n); x=x0; mu=mu0; lam=lam0; Bk=B0; sigma=0.8; epsilon1=1e-6; epsilon2=1e-5; [hk,gk]=cons(x); dfk=df1(x); [Ae,Ai]=dcons(x); Ak=[Ae; Ai]; k=0; while(k<maxk) [dk,mu,lam]=qpsubp(dfk,Bk,Ae,hk,Ai,gk); mp1=norm(hk,1)+norm(max(-gk,0),1); if(norm(dk,1)<epsilon1)&(mp1<epsilon2) break; end deta=0.05; tau=max(norm(mu,inf),norm(lam,inf)); if(sigma*(tau+deta)<1) sigma=sigma; else sigma=1.0/(tau+2*deta); end im=0; while(im<=20) if(phi1(x+rho^im*dk,sigma)-phi1(x,sigma)<eta*rho^im*dphi1(x,sigma,dk)) mk=im; break; end im=im+1; if(im==20), mk=10; end end alpha=rho^mk; x1=x+alpha*dk; [hk,gk]=cons(x1); dfk=df1(x1); [Ae,Ai]=dcons(x1); Ak=[Ae; Ai]; lamu=pinv(Ak)'*dfk; if(l>0&m>0) mu=lamu(1:l); lam=lamu(l+1:l+m); end if(l==0), mu=[]; lam=lamu; end if(m==0), mu=lamu; lam=[]; end sk=alpha*dk; yk=dlax(x1,mu,lam)-dlax(x,mu,lam); if(sk'*yk>0.2*sk'*Bk*sk) theta=1; else theta=0.8*sk'*Bk*sk/(sk'*Bk*sk-sk'*yk); end zk=theta*yk+(1-theta)*Bk*sk; Bk=Bk+zk*zk'/(sk'*zk)-(Bk*sk)*(Bk*sk)'/(sk'*Bk*sk); x=x1; k=k+1; end val=f1(x); function p=phi1(x,sigma) f=f1(x); [h,g]=cons(x); gn=max(-g,0); l0=length(h); m0=length(g); if(l0==0), p=f+1.0/sigma*norm(gn,1); end if(m0==0), p=f+1.0/sigma*norm(h,1); end if(l0>0&m0>0) p=f+1.0/sigma*(norm(h,1)+norm(gn,1)); end function dp=dphi1(x,sigma,d) df=df1(x); [h,g]=cons(x); gn=max(-g,0); l0=length(h); m0=length(g); if(l0==0), dp=df'*d-1.0/sigma*norm(gn,1); end if(m0==0), dp=df'*d-1.0/sigma*norm(h,1); end if(l0>0&m0>0) dp=df'*d-1.0/sigma*(norm(h,1)+norm(gn,1)); end function l=la(x,mu,lam) f=f1(x); [h,g]=cons(x); l0=lemgth(h); m0=length(g); if(l0==0), l=f-lam*g; end if(m0==0), l=f-mu'*h; end if(l0>0&m0>0) l=f-mu'*h-lam'*g; end function dl=dlax(x,mu,lam) df=df1(x); [Ae,Ai]=dcons(x); [m1,m2]=size(Ai); [l1,l2]=size(Ae); if(l1==0), dl=df-Ai'*lam; end if(m1==0), dl=df-Ae'*mu; end if(l1>0&m1>0), dl=df-Ae'*mu-Ai'*lam; end function f=f1(x) f=4*x(1)-x(2)^2-12; function df=df1(x) df=[4, -2*x(2)]'; function [h,g]=cons(x) h=[25-x(1)^2-x(2)^2]; g=[x(1);x(2)]; function [dh,dg]=dcons(x) dh=[-2*x(1), -2*x(2)]; dg=[1 0; 0 1]; Qpsubp.m文献 function [d,mu,lam,val,k]=qpsubp(dfk,Bk,Ae,hk,Ai,gk) n=length(dfk); l=length(hk); m=length(gk); gamma=0.05; epsilon=1.0e-6; rho=0.5; sigma=0.2; ep0=0.05; mu0=0.05*zeros(l,1); lam0=0.05*zeros(m,1); d0=ones(n,1); u0=[ep0;zeros(n+l+m,1)]; z0=[ep0; d0; mu0;lam0,]; k=0; z=z0; ep=ep0; d=d0; mu=mu0; lam=lam0; while (k<=150) dh=dah(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk); if(norm(dh)<epsilon) break; end A=JacobiH(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk); b=beta(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk,gamma)*u0-dh; dz=A\b; if(l>0&m>0) de=dz(1); dd=dz(2:n+1); du=dz(n+2:n+l+1); dl=dz(n+l+2:n+l+m+1); end if(l==0) de=dz(1); dd=dz(2:n+1); dl=dz(n+2:n+m+1); end if(m==0) de=dz(1); dd=dz(2:n+1); du=dz(n+2:n+l+1); end i=0; while (i<=20) if(l>0&m>0) dh1=dah(ep+rho^i*de,d+rho^i*dd,mu+rho^i*du,lam+rho^i*dl,dfk,Bk,Ae,hk,Ai,gk); end if(l==0) dh1=dah(ep+rho^i*de,d+rho^i*dd,mu,lam+rho^i*dl,dfk,Bk,Ae,hk,Ai,gk); end if(m==0) dh1=dah(ep+rho^i*de,d+rho^i*dd,mu+rho^i*du,lam,dfk,Bk,Ae,hk,Ai,gk); end if(norm(dh1)<=(1-sigma*(1-gamma*ep0)*rho^i)*norm(dh)) mk=i; break; end i=i+1; if(i==20), mk=10; end end alpha=rho^mk; if(l>0&m>0) ep=ep+alpha*de; d=d+alpha*dd; mu=mu+alpha*du; lam=lam+alpha*dl; end if(l==0) ep=ep+alpha*de; d=d+alpha*dd; lam=lam+alpha*dl; end if(m==0) ep=ep+alpha*de; d=d+alpha*dd; mu=mu+alpha*du; end k=k+1; end val=0.5*d'*Bk*d+dfk'*d; function p=phi(ep,a,b) p=a+b-sqrt(a^2+b^2+2*ep^2); function dh=dah(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk) n=length(dfk); l=length(hk); m=length(gk); dh=zeros(n+l+m+1,1); dh(1)=ep; if(l>0&m>0) dh(2:n+1)=Bk*d-Ae'*mu-Ai'*lam+dfk; dh(n+2:n+l+1)=hk+Ae*d; for(i=1:m) dh(n+l+1+i)=phi(ep,lam(i),gk(i)+Ai(i,:)*d); end end if(l==0) dh(2:n+1)=Bk*d-Ai'*lam+dfk; for(i=1:m) dh(n+1+i)=phi(ep,lam(i),gk(i)+Ai(i,:)*d); end end if(m==0) dh(2:n+1)=Bk*d-Ae'*mu+dfk; dh(n+2:n+l+1)=hk+Ae*d; end dh=dh(:); function bet=beta(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk,gamma) dh=dah(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk); bet=gamma*norm(dh)*min(1,norm(dh)); function [dd1,dd2,v1]=ddv(ep,d,lam,Ai,gk) m=length(gk); dd1=zeros(m,m); dd2=zeros(m,m); v1=zeros(m,1); for(i=1:m) fm=sqrt(lam(i)^2+(gk(i)+Ai(i,:)*d)^2+2*ep^2); dd1(i,i)=1-lam(i)/fm; dd2(i,i)=1-(gk(i)+Ai(i,:)*d)/fm; v1(i)=-2*ep/fm; end function A=JacobiH(ep,d,mu,lam,dfk,Bk,Ae,hk,Ai,gk) n=length(dfk); l=length(hk); m=length(gk); A=zeros(n+l+m+1,n+l+m+1); [dd1,dd2,v1]=ddv(ep,d,lam,Ai,gk); if(l>0&m>0) A=[1, zeros(1,n), zeros(1,l), zeros(1,m); zeros(n,1), Bk, -Ae', - Ai'; zeros(l,1), Ae, zeros(l
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服