大连理工大学优化方法上机作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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