大连理工大学优化方法上机作业

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大连理工大学优化方法上机

作业

-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

优化方法上机大作业

学院:电子信息与电气工程学部

姓名:

学号:

指导老师:

上机大作业(一)

%目标函数

function f=fun(x)

f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;

end

%目标函数梯度

function gf=gfun(x)

gf=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)]; End

%目标函数Hess矩阵

function He=Hess(x)

He=[1200*x(1)^2-400*x(2)+2,-400*x(1);

-400*x(1), 200;];

end

%线搜索步长

function mk=armijo(xk,dk)

beta=0.5; sigma=0.2;

m=0; maxm=20;

while (m<=maxm)

if(fun(xk+beta^m*dk)<=fun(xk)+sigma*beta^m*gfun(xk)'*dk) mk=m; break;

end

m=m+1;

end

alpha=beta^mk

newxk=xk+alpha*dk

fk=fun(xk)

newfk=fun(newxk)

%最速下降法

function [k,x,val]=grad(fun,gfun,x0,epsilon)

%功能:梯度法求解无约束优化问题:minf(x)

%输入:fun,gfun分别是目标函数及其梯度,x0是初始点,

% epsilon为容许误差

%输出:k是迭代次数,x,val分别是近似最优点和最优值

maxk=5000; %最大迭代次数

beta=0.5; sigma=0.4;

k=0;

while(k

gk=feval(gfun,x0); %计算梯度

dk=-gk; %计算搜索方向

if(norm(gk)

m=0;mk=0;

while(m<20) %用Armijo搜索步长

if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk) mk=m;break;

end

m=m+1;

end

x0=x0+beta^mk*dk;

k=k+1;

end

x=x0;

val=feval(fun,x0);

>> x0=[0;0];

>> [k,x,val]=grad('fun','gfun',x0,1e-4)

迭代次数:

k =

1033

x =

0.9999

0.9998

val =

1.2390e-008

%牛顿法

x0=[0;0];ep=1e-4;maxk=10;k=0;

while(k

gk=gfun(x0);

if(norm(gk)

x=x0

miny=fun(x)

k0=k

break;

else

H=inv(Hess(x0));

x0=x0-H*gk;

k=k+1;

end

end

x =

1.0000

1.0000

miny =

4.9304e-030

迭代次数

k0 =

2

%BFGS方法

function [k,x,val]=bfgs(fun,gfun,x0,varargin) %功能:梯度法求解无约束优化问题:minf(x)

%输入:fun,gfun分别是目标函数及其梯度,x0是初始点,% epsilon为容许误差

%输出:k是迭代次数,x,val分别是近似最优点和最优值

N=1000;

epsilon=1e-4;

beta=0.55;sigma=0.4;

n=length(x0);Bk=eye(n);

k=0;

while(k

gk=feval(gfun,x0,varargin{:});

if(norm(gk)

dk=-Bk\gk;

m=0;mk=0;

while(m<20)

newf=feval(fun,x0+beta^m*dk,varargin{:});

oldf=feval(fun,x0,varargin{:});

if(newf<=oldf+sigma*beta^m*gk'*dk)

mk=m;break;

end

m=m+1;

end

x=x0+beta^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{:});

>> x0=[0;0];

>> [k,x,val]=bfgs('fun','gfun',x0)

k =

20

x =

1.0000

1.0000

val =

2.2005e-011

相关文档
最新文档