大连理工优化作业matlab源程序.docx
《大连理工优化作业matlab源程序.docx》由会员分享,可在线阅读,更多相关《大连理工优化作业matlab源程序.docx(13页珍藏版)》请在冰豆网上搜索。
大连理工优化作业matlab源程序
2000年11月9日
%第二章第17题,修正单纯形法解习题11
(1)
clc;
clear;
A=[212;331];
[m,n]=size(A);
b=[4;3];
r=[411];
c=[411];
bs=[2:
3];
nbs=[1:
1];a1=A(:
1);
T=A(:
bs);
a2=inv(T)*a1;
b=inv(T)*b;
A=[a2,eye(m)];
B=eye(m);
xb=B\b;
cb=c(bs);%
cn=c(nbs);
con=1;
M=zeros
(1);
whilecon
M=M+1;
t=cb/B;
r=c-t*A;
ifall(r>=0)
x(bs)=xb;
x(nbs)=0;
fx=cb*xb;
disp(['当前解是最优解,minz=',num2str(fx)])
disp('当前解为')
disp(x)
break
end
rnbs=r(nbs);
kk=find(rnbs==min(rnbs));
k=kk
(1);
Anbs=A(:
nbs);
yik=B\Anbs(:
k);%yik
xb=B\b;%yi0
ifall(yik<=0)
disp('此LP问题无有限的最优解,计算结束',x)
disp(xb)
break
else
i=find(yik>0);
w=abs(xb(i,1)./yik(i,1));
l=find(w==min(w));
rr=min(l);
yrrk=yik(rr,1);
Abs=A(:
bs);
D=Anbs(:
k);
Anbs(:
k)=Abs(:
rr);
Abs(:
rr)=D;
F=bs(rr);
bs(rr)=nbs(k);
nbs(k)=F;
AA=[Anbs,Abs];
EE=eye(m);
EE(:
rr)=-yik./yrrk;
Errk=EE;
Errk(rr,rr)=1/yrrk;
BB=Errk/B;
B=inv(BB);
cb=c(:
bs);
xb=Errk*xb;
x(bs)=xb;
x(nbs)=0;
fx=cb*xb;
end
ifM>=1000
disp('此问题无有限最优解')
break
end
end
%第二章第17题修正单纯型法解第11
(2)
A=[1-12-1;21-31;1111];
[m,n]=size(A);
b=[2;6;7];
r=[21-1-1];
c=[21-1-1];
bs=[1:
3];
nbs=[4:
4];
a1=A(:
4);
T=A(:
bs);
a2=inv(T)*a1;
b=inv(T)*b;
A=[eye(m),a2];
B=eye(m);
xb=B\b;
cb=c(bs);%
cn=c(nbs);
con=1;
M=zeros
(1);
whilecon
M=M+1;
t=cb/B;
r=c-t*A;
ifall(r>=0)
x(bs)=xb;
x(nbs)=0;
fx=cb*xb;
disp(['当前解是最优解,minz=',num2str(fx)])
disp('对应的最优解为,x=')
disp(x)
break
end
rnbs=r(nbs);
kk=find(rnbs==min(rnbs));
k=kk
(1);
Anbs=A(:
nbs);
yik=B\Anbs(:
k);
xb=B\b;%yi0
ifall(yik<=0)
disp('此LP问题无有限的最优解,计算结束',x)
disp(xb)
break
else
i=find(yik>0);
w=abs(xb(i,1)./yik(i,1));
l=find(w==min(w));
rr=min(l);
yrrk=yik(rr,1);
Abs=A(:
bs);
D=Anbs(:
k);
Anbs(:
k)=Abs(:
rr);
Abs(:
rr)=D;
F=bs(rr);
bs(rr)=nbs(k);
nbs(k)=F;
AA=[Anbs,Abs];
EE=eye(m);
EE(:
rr)=-yik./yrrk;
Errk=EE;
Errk(rr,rr)=1/yrrk;
BB=Errk/B;
B=inv(BB);
cb=c(:
bs);
xb=Errk*xb;
x(bs)=xb;
x(nbs)=0;
fx=cb*xb;
end
ifM>=1000
disp('此问题无有限最优解')
break
end
end
%这是第三章十一题
%f(x)=x^2+exp(-x);
%x=[-2,3]
%采用0.618法
clc;
clear;
a=-2;
b=3;%
cout=1;
MAX=100;
k=0.618;
e=0.00001;
x1=a+(1-k)*(b-a);
x2=a+k*(b-a);
while(coutif(b-axx=0.5*(b+a);
disp('最优解x=')
disp(xx)
disp('最优值为f(x)=')
disp(exp(-xx)+xx^2)
break;
elseif(b-a>e)
if((x1^2+exp(-x1))>(x2^2+exp(-x2)))
a=x1;
b=b;
x1=x2;
x2=a+k*(b-a);
cout=cout+1;
elseif((x1^2+exp(-x1))<=(x2^2+exp(-x2)))
a=a;
b=x2;
x2=x1;
x1=a+(1-k)*(b-a);
cout=cout+1;
end
end
end
%这是第三章第15题,要求采用不精确一维搜索算法二解问题
clc;
clear;
symsx1x2k
y=100*(x2-x1^2)^2+(1-x1)^2;
v=[x1x2];%X(i)
g=jacobian(y,v);
z=subs(y,{x1,x2},{x1+k,x2+k});%X(i)+k*S(i)
z1=subs(z,{x1,x2},{-1,1});
z2=diff(z1,k);
k1=0;
k2=100;
k3=inf;
cout=1;
MAX=1000;
c1=0.1;
c2=0.5;
T=0.1;
s=[1;1];
while(couty1=subs(y,{x1,x2},{-1,1});
y2=subs(z1,k,k2);%f(x(i+1))
g1=subs(g,{x1,x2},{-1,1});
g3=subs(g,{x1,x2},{x1+k,x2+k});
g2=subs(g3,{x1,x2,k},{-1,1,k2});
if((y1-y2)>=(-c1*k2*(g1*s))&&(g2*s)>=c2*(g1*s))
KK=k2;
disp('最小步长=')
disp(KK)
break;
elseif((y1-y2)<(-c1*k2*(g1*s))||(g2*s)u1=subs(z1,k,k1);
u2=subs(z1,k,k2);
uu=subs(g,{x1,x2},{-1+k1,1+k1})*s;
u=k1+0.5*(k2-k1)/(1+(u1-u2)/((k2-k1)*uu));
%u=k1+(k2-k1)/((u2-u1)/((k2-k1)*uu)-1);
if(u>k1&&uk3=k2;
k2=u;
elseif(u>=k2&&uk1=k2;
k2=u;
elseif(u<=k1)
u=k1+T*(k3-k1);
k2=u;
elseif(u>=k3)
u=k3-T*(k3-k1);
k2=u;
end
m=[k1k2k3ucout];
cout=cout+1;
end
end
%这是第三章第19题,要求采用阻尼牛顿法计算函数的极小值
clc;
clear;
symsx1x2k
m=3;
n=2;
e=0.000000000000000000000001;
MAX=10;
cout=1;
%y=x1^2+x2^2+x1*x2-3*x1;
y=ff(x1,x2);
y1=diff(y,x1);
y2=diff(y,x2);
y11=diff(y1,x1);
y12=diff(y1,x2);
y21=diff(y2,x1);
y22=diff(y2,x2);
while(coutdf1=subs(y1,{x1,x2},{m,n});
df2=subs(y2,{x1,x2},{m,n});
if((double(df1))^2+(double(df2))^2>e)
A=[y11y12;y21y22];
B=[df1;df2];
C=inv(A);
S=-C*B;
z=ff(x1+k*S(1,1),x2+k*S(2,1));
z1=subs(diff(z,k),{x1,x2},{m,n});
kk=solve(z1,k);
S2=[m+kk*S(1,1);n+kk*S(2,1)];
m=S2(1,1);
n=S2(2,1);
cout=cout+1;
elseif((double(df1))^2+(double(df2))^2<=e)
X=eye
(2)*S2;
disp('最优解,x=')
disp(X);
disp('最优值,f(x)=')
disp(subs(y,{x1,x2},{X(1,1),X(2,1)}))
cout=cout+1;
break;
end
end
%函数文件,单独成文件
functiony=ff(a,b)
y=a^2+b^2+a*b-3*a;
clc;
clear;
symsx1x2k
e=0.000001;
MAX=300;
cout=1;
m=2;
n=0;
X0=[m;n];
temp=1;
y=myBFGS(x1,x2);
H0=eye
(2);
y1=diff(y,x1);
y2=diff(y,x2);
mmm=0;
G0=subs([y1;y2],{x1,x2},{m,n});
while(coutdf1=subs(y1,{x1,x2},{X0(1,1),X0(2,1)});
df2=subs(y2,{x1,x2},{X0(1,1),X0(2,1)});
m=X0(1,1);
n=X0(2,1);
if((double(df1))^2+(double(df2))^2>e)
S0=-H0*G0;
z=myBFGS(x1+k*S0(1,1),x2+k*S0(2,1));
z1=diff(z,k);
z2=subs(z1,{x1,x2},{m,n});
k1=double(solve(z2,k));
kk=1;
fori=1:
numel(k1)
if(imag(k1(i))==0)
if(k1(i)<1&&k1(i)>0)
if(k1(i)kk=k1(i);
end
end
end
end
X1=[m+kk*S0(1,1);n+kk*S0(2,1)];XX=subs(X1-X0,{x1,x2},{m,n});
G1=subs([y1;y2],{x1,x2},{X1(1,1),X1(2,1)});GG=G1-G0;
u=1+GG'*H0*GG/(XX'*GG);
H1=H0+(u*XX*XX'-H0*GG*XX'-XX*GG'*H0)/(XX'*GG);
G0=G1;
X0=X1;
H0=H1;
cout=cout+1;
elseif((double(df1))^2+(double(df2))^2<=e)
disp('最优解为,x=')
disp(X0);
break;
end
end
functiony=myBFGS(a,b)
y=(a-1)^2+5*(b-a^2)^2;%这是26题的函数
%第三章第31题,BFGS法解习题27
clc;
clear;
symsx1x2k
e=0.000001;
MAX=300;
cout=1;
m=1;
n=0;
X0=[m;n];
y=myBFGS(x1,x2);
H0=eye
(2);
y1=diff(y,x1);
y2=diff(y,x2);
mmm=0;
G0=subs([y1;y2],{x1,x2},{m,n});
while(coutdf1=subs(y1,{x1,x2},{X0(1,1),X0(2,1)});
df2=subs(y2,{x1,x2},{X0(1,1),X0(2,1)});
m=X0(1,1);
n=X0(2,1);
if((double(df1))^2+(double(df2))^2>e)
S0=-H0*G0;
z=myBFGS(x1+k*S0(1,1),x2+k*S0(2,1));
z1=diff(z,k);
z2=subs(z1,{x1,x2},{m,n});
k1=double(solve(z2,k));
kk=0;
fori=1:
numel(k1)
if(imag(k1(i))==0)
kk=k1(i);
end
end
X1=[m+kk*S0(1,1);n+kk*S0(2,1)];
XX=subs(X1-X0,{x1,x2},{m,n});
G1=subs([y1;y2],{x1,x2},{X1(1,1),X1(2,1)});
GG=G1-G0;
u=1+GG'*H0*GG/(XX'*GG);
H1=H0+(u*XX*XX'-H0*GG*XX'-XX*GG'*H0)/(XX'*GG);
G0=G1;
X0=X1;
H0=H1;
cout=cout+1;
elseif((double(df1))^2+(double(df2))^2<=e)
disp('最优解为,x=')
disp(X0);
break;
end
end
%M函数文件,单独文件
functiony=myBFGS(a,b)
y=a+2*b^2+exp(a^2+b^2);%这是27题的函数