1、大连理工大学优化作业程序1.1程序(Java)public class Wolfe_Powell public static double getFx ( double x ) double x1= x0; double x2 = x1; double Fx= 100 * (x2-x1*x1)* (x2-x1*x1) + (1-x1)* (1-x1) ; return Fx; public static double getDeltFx ( double x ) double x1= x0; double x2 = x1; double deltFx = new double2; deltFx
2、 0 = -400*(x2 - x1* x1) *x1- 2*(1- x1) ; deltFx 1 = 200*(x2- x1 * x1) ; return deltFx ; public static double getDeltFx_Sk ( double deltFx , double Sk ) double a = 0 ; for ( int i = 0 ; i Sk.length ; i+ ) a = a + deltFx i * Sk i ; return a ; public static double getL ( double x, double s ) double x1=
3、 x0; double x2 = x1; double c1 =0.1 , c2 =0.5 ,a =0 , b=1e8 ,L= 1; double Fx0 , Fx1 ,deltFx1_Sk ,deltFx0_Sk ,temp ,temp2; double deltFx0 , deltFx1 ; Fx0 = getFx(x) ; deltFx0 = getDeltFx (x) ; deltFx0_Sk = getDeltFx_Sk( deltFx0 , s) ; temp = c2 * getDeltFx_Sk( deltFx0 , s) ; for ( int i=0;i= temp2 &
4、deltFx1_Sk = temp) break ; else if( (Fx0 - Fx1 ) temp2 ) b = L ; L = (L +a) /2 ; else if ( deltFx1_Sk = 2*L ? (2*L):( L + b ) / 2; System.out.println( L= + L); System.out.println( 计算次数 + i ); return L ; public static void main(String args) Wolfe_Powell temp =new Wolfe_Powell(); double X = -1 ,1 ; do
5、uble sk = 1 ,1 ; temp.getL( X ,sk) ; 1.2实验结果步长L = 0.00390625 x =-0.9992 , 1.0324 计算次数 8 2.1程序(Java)public class GongE public static double getFx ( double x ) double x1= x0; double x2 = x1;double Fx= x1*x1 - 2*x1*x2 + 2*x2*x2 +x3*x3 - x2*x3 +2 * x1 +3*x2 -x3 ; return Fx; public static double getDeltF
6、x ( double x ) double x1= x0; double x2 = x1; double deltFx = new doublex.length;deltFx 0 = 2*x1 - 2*x2+2 ;deltFx 1 = -2*x1 +4*x2 - x3 +3;deltFx 2 = 2*x3 -x2 -1 ; return deltFx ; public static double getX ( double x ) double g0,g1; double s0= new doublex.length; double s1=new doublex.length; double
7、g0_L,g1_L ,L ,temp; double x0 =x ; int k =0 ; g0 = getDeltFx ( x0 ) ; for ( int j = 0 ; j x.length ; j+ ) s0 j = -g0 j ; for (int i = 0 ;i2; i +,k+) g0 = getDeltFx ( x0 ) ; g0_L = getDeltFx_Sk ( s0 , s0 ) ; L =getL(x0,s0); / 例题一中的方法取得步长L for(int j=0;jx.length ; j+) x0j= x0j+ s0j*L ; g1 = getDeltFx(x
8、0) ; g1_L = getDeltFx_Sk ( g1 , g1 ); if ( Math.sqrt( g1_L )= 1e-2 ) break ; else temp = g1_L/ g0_L ; for(int j=0;jx.length ; j+) s0j = -g1j + temp * s0j; return x0; public static void main(String args) GongE temp =new GongE(); double x = 1,1 ; double result = temp.getX(x) ; for ( int i = 0 ; i x.le
9、ngth ; i+ ) System.out.println ( result + i + = + result i ) ; 2.2实验结果最优点 x*=-4,-3,-1 最优解 f*=-8 3.1公用程序(Java) public static double getFx ( double x ) /取得Fx 值 double x1= x0; double x2 = x1;double Fx = x1 + 2 * x2 * x2 + Math.exp ( x1 * x1 + x2 * x2 ) ; return Fx ; public static double getDeltFx ( dou
10、ble x ) /取得Fx 的梯度值 double x1= x0; double x2 = x1; double deltFx = new double 2 ;deltFx 0 = 1 + 2 * x1 * Math.exp ( x1 * x1 + x2 * x2 ) ; deltFx 1 = 4 * x2 + 2 * x2 * Math.exp ( x1 * x1 + x2 * x2 ) ; return deltFx ; 3.2.1最速下降法程序(Java)public class FastWay public static double getX ( double x ) double
11、deltF0 = new double2; double L =0; for ( int i = 0 ; i 1e1 ; i+ ) deltF0 = getDeltFx(x); for(int j=0 ;j deltF0.length ;j+) /取得负梯度 deltF0j = - deltF0j; L = getL ( x , deltF0 ) ; / 调用习题1的不精确搜索取得步长L if ( Math.sqrt ( getDeltFx_Sk ( deltF0 , deltF0 ) ) = 1e-3 ) System.out.println ( 最终计算次数 + i ) ; System.
12、out.println(x1= + x0+ x2= + x1); break ; x0 = x0+ L * deltF0 0 ; x1= x1+ L * deltF0 1 ; return x; public static void main ( String args ) FastWay temp = new FastWay () ; double x0 = 2 , 2 ; temp.getX(x0) ; 3.2.2最速下降法结果 最优点X*=-0.4194 0 最优解f*=0.7729 计算次数count=103.3.1牛顿法程序(Java) public static double ge
13、tDeltFx ( double x ) double x1 = x 0 ; double x2 = x 1 ; double one = new double 2 ; double exp =Math.exp( Math.pow(x1,2)+Math.pow(x2,2) ; one 0 = 1+ 2*x1*exp ; one 1 = 4* x2 +2*x2*exp ; double two = new double22 ; two00 = 2*exp *(1+2*Math.pow(x1,2) ; two11 = 2*exp *(1+2*Math.pow(x2,2) +4 ; double d
14、eltFx = new double 2 ; for (int i = 0 ; i 2 ; i+ ) deltFx0 = one 0 /two00 ; deltFx1 = one 1 /two11 ; return deltFx; public static void main ( String args ) double x = 1 , 0 ; double DeltFx = new double 2 ; for(int i =0 ;i 1e3;i+) DeltFx = getDeltFx(x); x0 = x0- DeltFx0; x1 = x1- DeltFx1; if( Math.sq
15、rt( getDeltFx_Sk(DeltFx,DeltFx ) ) = 1e-4) System.out.println(计算次数为 + i); break ; System.out.println( x1= +x0 + x2= + x1 +n) ; System.out.println( Fx= +getFx(x) ; 3.3.2牛顿法结果 最优点X*= -0.4194 , 0 最优解f*= 0.7729 计算次数count=53.4.1 BFGS法程序(matlab)function x,val,k = bfgs(fun,gfun,x0)maxk=1000; sigma=0.4; rho
16、=0.55 ; epsion=1e-5;k=0 ; n =length(x0);Bk=eye(n); %Bk=feval(Hess,x0);while (kmaxk) gk=feval(gfun,x0); if(norm(gk)epsion),break;end; dk=-Bkgk; m=0;mk=0; while(m20) newf=feval(fun,x0+rhom*dk) oldf=feval(fun,x0) if(newf0) Bk=Bk-(Bk*sk*sk*Bk)/(sk*Bk*sk)+(yk*yk)/(yk*sk); end; k=k+1; x0=x;endval=feval(fu
17、n,x0);3.4.2 BFGS法结果 最优点X*=-0.4194 0 最优解f*=0.7729 计算次数count=44.1 有效集法(matlab)4.1.1 主程序functionx , Lagrange , exitflag , output= TwoProg (H,c,Ae,be,Ai,bi,x0)n=length(x0); x=x0; ni=length(bi); ne=length(be); Lagrange =zeros(ne+ni,1); index=ones(ni,1);for(i=1:ni) if(Ai(i,:)*xbi(i)+1e-9),index(i)=0;enden
18、d%算法主程序k=0;while(k0),Temp=Ae ; end for(j=1:ni) if(index(j)0),Temp=Temp;Ai(j,:);end end gk=H*x+c; m1,n1=size(Temp); dk,Lagrange =SubPro (H,gk , Temp,zeros(m1,1); if(norm(dk)ne) y,jk=min(Lagrange (ne+1:length(Lagrange ); end if(y=0) exitflag=0; else exitflag=1; for(i=1:ni) if(index(i)&(ne+sum(index(1:
19、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,:)*dk0) tm1=(bi(i)-Ai(i,:)*x)/(Ai(i,:)*dk); if(tm1tm) tm=tm1;ti=i; end end end alpha=min(alpha,tm); x=x+alpha*dk; if(tm0) rb=Ae*ginvH*c+be; Lagrange =pinv(Ae*ginvH*Ae)*rb; x=ginvH*(Ae
20、*Lagrange -c);else x=-ginvH*c; Lagrange =0;end4.1.4 运行函数H=2 -2;-2 4;c=-2 -6;Ae= ;be= ;Ai=1 -2;-0.5 -0.5;1 0;0 1;bi=-2 -1 0 0;x0=0 1 ;x,lambda,exitflag,output=qpact(H,c,Ae,be,Ai,bi,x0)4.2 有效集法结果 内部点 初始点x0=0 0 最优点X*=0.8 1.2 最优解f*=-7.2 迭代次数=10 边界点 初始点x0=1 1 最优点X*=0.8 1.2 最优解f*=-7.2 迭代次数=2 检验点 初始点x0=0 1
21、 最优点X*=0.8 1.2 最优解f*=-7.2 迭代次数=75.1 乘子法程序(matlab)5.1.1 chengZi程序-乘子法主程序functionx,mu,Lagrange ,output=chengZi(fun,hf,gf,dfun,dhf,dgf,x0)sigma=2.0;count=0;innerCount=0; eta=2.0;=0.8;%PHR算法中的实参数 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);Lagrang
22、e =0.1*ones(m,1);btak=10;btaold=10;%用来检验终止条件的两个值while(btak1e-6&count1e-6 if(count=2&btak*btaold) sigma=eta*sigma; end %更新乘子向量 for(i=1:l),mu(i)=mu(i)-sigma*he(i);end for(i=1:m) Lagrange (i)=max(0.0,Lagrange (i)-sigma*gi(i); end end count=count+1; btaold=btak; x0=x;endf=feval(fun,x)output.inner_iter=i
23、nnerCount;output.iter=count;output.bta=btak;output.fval=f;5.1.2 f1程序-目标函数function f=f1(x)f=4*x(1)-x(2)2-12;5.1.3 h1程序-等式约束function he=h1(x)he=25-x(1)2-x(2)2;5.1.4 g1程序-不等式约束function gi=g1(x)gi=10*x(1)-x(1)2+10*x(2)-x(2)2-34;5.1.5 df1程序-目标函数的梯度文件function g=df1(x)g=4 ,-2.0*x(2);5.1.6 dhe程序-等式约束(向量)函数的
24、Jacobi矩阵(转置)function dhe=dh1(x)dhe=-2*x(1),-2.0*x(2);5.1.7 dgi程序-不等式约束(向量)函数的Jacobi矩阵(转置)function dgi=dg1(x)dgi=10-2*x(1),10-2*x(2);0,1;1,0;5.1.8 LagrTiDu程序-增广拉格朗日函数的梯度程序function result=LagrTiDu(x,fun,hf,gf,dfun,dhf,dgf,mu,Lagrange ,sigma)result=feval(dfun,x);he=feval(hf,x);gi=feval(gf,x);dhe=feval(
25、dhf,x);dgi=feval(dgf,x);l=length(he);m=length(gi);for(i=1:l) result=result+(sigma*he(i)-mu(i)*dhe(:,i); endfor(i=1:m) result=result+(sigma*gi(i)-Lagrange (i)*dgi(:,i);end5.1.9 Lagr程序-增广拉格朗日函数程序function result=Lagr(x,fun,hf,gf,dfun,dhf,dgf,mu,Lagrange ,sigma)f=feval(fun,x);he=feval(hf,x);gi=feval(gf,x);l=length(he);m=length(gi);result=f;s1=0.0;for(i=1:l) result=result-he(i)*mu(i); s1=s1+he(i)2;endresult=result+0.5