实用最优化方法Matlab程序设计.docx
《实用最优化方法Matlab程序设计.docx》由会员分享,可在线阅读,更多相关《实用最优化方法Matlab程序设计.docx(30页珍藏版)》请在冰豆网上搜索。
![实用最优化方法Matlab程序设计.docx](https://file1.bdocx.com/fileroot1/2022-11/16/86925dd2-8e66-47bc-bfbf-4f673f8f577d/86925dd2-8e66-47bc-bfbf-4f673f8f577d1.gif)
实用最优化方法Matlab程序设计
实用最优化方法Matlab程序设计
程序如下:
functionlambda=nonexact(x0,s0)
g0=grad(x0);
f0=f(x0);
a=0;
c1=0.1;
c2=0.5;
lambdak=1;
sk=s0;
d=-c1*lambdak*g0'*sk;
xk=x0+lambdak*sk;
f1=f(xk);
e=f0-f1;
whiled>e
lambdak=(lambdak+a)/2;
xk=x0+lambdak*sk;
fk=f(xk);
e=f0-fk;
d=-c1*lambdak*g0'*sk;
end
lambdak
functiong=grad(x)
g=zeros(2,1);
g
(1)=-4*x
(1)*(x
(2)-x
(1)^2)-2*(1-x
(1));
g
(2)=2*(x
(2)-x
(1)^2);
functionfa=f(x)
fa=(x
(2)-x
(1)^2)^2+(1-x
(1))^2;
在命令窗口中输入x0=[0;1];s0=[-1;1];nonexact(x0,s0)
输出结果为:
程序如下:
functionx_star=cong(x0,eps)
g0=grad(x0);
res0=norm(g0);
resk=res0;
k=0;
xk=x0;
whileresk>eps
k=k+1;
ifk==1
sk=-grad(xk);
else
sk=-grad(xk)+resk^2/res0^2*s0;
end
lambdak=step(xk,sk);
x0=xk;
xk=x0+lambdak*sk;
res0=resk;
resk=norm(grad(xk));
s0=sk;
fprintf('------the%d-thiteration,theresidualis%f,thelambdakis%f\n\n',k,resk,lambdak);
end
x_star=xk;
disp('theoptimalsolutionis');
x_star
%subfunctions
functiong=grad(x)
g=zeros(4,1);
g
(1)=2*x
(1)-2*x
(2)+2;
g
(2)=4*x
(2)-2*x
(1)-x(3)+3;
g(3)=2*x(3)-x
(2)-1;
g(4)=2*x(4);
functionlambda=step(x,s)
a=2*x
(1)*s
(1)-2*x
(2)*s
(1)-2*x
(1)*s
(2)+4*x
(2)*s
(2)+2*s(3)*x(3)+2*x(4)*s(4)-s
(2)*x(3)-s(3)*x
(2)+2*s
(1)+3*s
(2)-s(3);
b=2*s
(1)^2+4*s
(2)^2-4*s
(1)*s
(2)+2*s(3)^2+2*s(4)^2-2*s
(2)*s(3);
lambda=-a/b;
在命令窗口中输入x0=[0;0;0;0];eps=1e-6;cong(x0,eps)
输出结果为
-
当
=
时
程序如下:
functionx_star=dfph(x0,eps)
g0=grad(x0);
res0=norm(g0);
res=res0;
k=0;
xk=x0;
whileres>eps
k=k+1;
H=eye(length(x0));
sk=-H*grad(xk);
lambdak=nonexact(xk,sk);
x0=xk;
xk=x0+lambdak*sk;
res=norm(grad(xk));
fprintf('------the%d-thiteration,theresidualis%f,thelambdakis%f\n\n',k,res,lambdak);
end
x_star=xk;
disp('theoptimalsolutionis');
x_star
functionlambda=nonexact(x0,s0)
g0=grad(x0);
f0=f(x0);
a=0;
c1=0.1;
c2=0.5;
lambdak=1;
d=-c1*lambdak*g0'*s0;
xk=x0+lambdak*s0;
f1=f(xk);
e=f0-f1;
whiled>e
lambdak=(lambdak+a)/2;
xk=x0+lambdak*s0;
fk=f(xk);
e=f0-fk;
d=-c1*lambdak*g0'*s0;
end
lambda=lambdak;
functiong=grad(x)
g=zeros(2,1);
g
(1)=2*x
(1)*exp(x
(1)^2+x
(2)^2)+1;
g
(2)=4*x
(2)+2*x
(2)*exp(x
(1)^2+x
(2)^2);
functionfa=f(x)
fa=x
(1)+2*x
(2)^2+exp(x
(1)^2+x
(2)^2);
在命令窗口中输入x0=[0;1];eps=1e-3;dfph(x0,eps)
输出结果为:
当
时
程序如下:
functionx_star=newton1(x0,eps)
g0=grad(x0);
res0=norm(g0);
res=res0;
k=0;
xk=x0;
whileres>eps
k=k+1;
H=inv(GRAND(xk));
sk=-H*grad(xk);
lambdak=nonexact(xk,sk);
x0=xk;
xk=x0+lambdak*sk;
res=norm(grad(xk));
fprintf('------the%d-thiteration,theresidualis%f,thelambdakis%f\n\n',k,res,lambdak);
end
x_star=xk;
disp('theoptimalsolutionis');
x_star
functionlambda=nonexact(x0,s0)
g0=grad(x0);
f0=f(x0);
a=0;
c1=0.1;
c2=0.5;
lambdak=1;
d=-c1*lambdak*g0'*s0;
xk=x0+lambdak*s0;
f1=f(xk);
e=f0-f1;
whiled>e
lambdak=(lambdak+a)/2;
xk=x0+lambdak*s0;
fk=f(xk);
e=f0-fk;
d=-c1*lambdak*g0'*s0;
end
lambda=lambdak;
functiong=grad(x)
g=zeros(2,1);
g
(1)=2*x
(1)*exp(x
(1)^2+x
(2)^2)+1;
g
(2)=4*x
(2)+2*x
(2)*exp(x
(1)^2+x
(2)^2);
functionfa=f(x)
fa=x
(1)+2*x
(2)^2+exp(x
(1)^2+x
(2)^2);
functionG=GRAND(x)
G=zeros(2,2);
G
(1)=2*exp(x
(1)^2+x
(2)^2)+4*x
(1)^2*exp(x
(1)^2+x
(2)^2);
G
(2)=4*x
(1)*x
(2)*exp(x
(1)^2+x
(2)^2);
G(3)=4*x
(1)*x
(2)*exp(x
(1)^2+x
(2)^2);
G(4)=4+(2+4*x
(2)^2)*exp(x
(1)^2+x
(2)^2);
在命令窗口中输入x0=[0;1];eps=1e-3;newton1(x0,eps)
输出结果为:
取
为BFGS公式时:
程序如下:
functionx_star=bfgs1(x0,eps)
g0=grad(x0);
res0=norm(g0);
res=res0;
k=0;
xk=x0;
whileres>eps
k=k+1;
ifk==1
H=eye(length(x0));
else
H0=H;
mu=1+dg'*H0*dg/(dx'*dg);
H=H0+(mu*dx*dx'-H0*dg*dx'-dx*dg'*H0)/(dx'*dg);
end
sk=-H*grad(xk);
lambdak=nonexact(xk,sk);
x0=xk;
xk=x0+lambdak*sk;
dx=xk-x0;
dg=grad(xk)-grad(x0);
res=norm(grad(xk));
fprintf('------the%d-thiteration,theresidualis%f,thelambdakis%f\n\n',k,res,lambdak);
end
x_star=xk;
fm=f(xk);
disp('theoptimalsolutionis');
x_star
fm
functionlambda=nonexact(x0,s0)
g0=grad(x0);
f0=f(x0);
a=0;
c1=0.1;
c2=0.5;
lambdak=1;
d=-c1*lambdak*g0'*s0;
xk=x0+lambdak*s0;
f1=f(xk);
e=f0-f1;
whiled>e
lambdak=(lambdak+a)/2;
xk=x0+lambdak*s0;
fk=f(xk);
e=f0-fk;
d=-c1*lambdak*g0'*s0;
end
lambda=lambdak;
functiong=grad(x)
g=zeros(2,1);
g
(1)=2*x
(1)*exp(x
(1)^2+x
(2)^2)+1;
g
(2)=4*x
(2)+2*x
(2)*exp(x
(1)^2+x
(2)^2);
functionfa=f(x)
fa=x
(1)+2*x
(2)^2+exp(x
(1)^2+x
(2)^2);
在命令窗口中输入x0=[0;1];eps=1e-3;bfgs1(x0,eps)
输出结果为:
程序如下:
functionx=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(kAee=[];
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,z