优化方法大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [x,val,k]=frcg(fun,gfun,x0)
%输入: x0是初始点, fun, gfun分别是目标函数和梯度
%输出: x, val分别是近似最优点和最优值, k是迭代次数.
maxk=200; %最大迭代次数
rho=0.6;sigma=0.4;
k=0; epsilon=1e-4;
n=length(x0);
while(k g=feval(gfun,x0); %计算梯度 itern=k-(n+1)*floor(k/(n+1)); itern=itern+1; %计算搜索方向 if(itern==1) d=-g; else beta=(g'*g)/(g0'*g0); d=-g+beta*d0; gd=g'*d; if(gd>=0.0) d=-g; end end if(norm(g) m=0; mk=0; while(m<20) %Armijo搜索 if(feval(fun,x0+rho^m*d) end m=m+1; end x0=x0+rho^mk*d; val=feval(fun,x0); g0=g; d0=d; k=k+1; end x=x0; val=feval(fun,x); x=reshape(x,10,10); x=double(x); disp('final x='),disp(x) disp('final y='),disp(val) 最速下降 clc; clear; x0=[-1.2;1;-1.2;1]; syms x1x2x3x4 xx=[ x1;x2;x3;x4]; fun=(x1-1)^2+(x3-1)^2+100*(x2-x1^2)^2+100*(x4-x3^2)^2; gfun=[2*(x1-1)-400*x1*(x2-x1^2);... 200*(x2-x1^2);... 2*(x3-1)-400*x3*(x4-x3^2);... 200*(x4-x3^2)]; maxk=10; %最大迭代次数 rho=0.5;sigma=0.4; k=0; epsilon=1e-5; xx=x0; k2=0; while(k2 g=subs(gfun,{x1 x2 x3 x4},{xx(1) xx(2) xx(3) xx(4)}); %计算梯度 d=-g; %计算搜索方向 if(norm(d) m=0; mk=0; while(m<20) %Armijo搜索 xz=xx+rho^m*d; if(subs(fun,{x1 x2 x3 x4},{xz(1) xz(2) xz(3) xz(4)}) mk=m; break; end m=m+1; end xx=xx+rho^mk*d; k=k+1; end %%%%牛顿 function [x,val,k]=dampnm(fun,gfun, Hess,x0) k2=0;maxk=100; rho=0.55;sigma=0.4; k=0; epsilon=1e-5; while(k2 gk=feval(gfun,x0); %计算梯度 Gk=feval(Hess,x0); %计算Hesse阵 dk=-Gk\gk; %解方程组Gk*dk=-gk, 计算搜索方向 if(norm(gk) m=0; mk=0; while(m<20) % 用Armijo搜索求步长 if(feval(fun,x0+rho^m*dk) mk=m; break; end m=m+1; end x0=x0+rho^mk*dk; k2=k2+1; end x2=x0; %%%%BFGS Bk=eye(n); K3=0; while(k3 gk=feval(gfun,x0); %计算梯度 if(norm(gk) break; end%检验终止准则 dk=-Bk\gk; m=0; mk=0; while(m<20) % 用Armijo搜索求步长 newf=feval(fun,x0+rho^m*dk); oldf=feval(fun,x0); if(newf mk=m; break; end m=m+1; end x=x0+rho^mk*dk; det_xk=x-x0; det_gk=feval(gfun,x)-gk; if(det_gk'*det_xk>0) Bk=Bk-(Bk*det_xk*det_xk'*Bk)/(det_xk'*Bk*det_xk)+(det_gk*det_gk')/(de t_gk'*det_xk); end k3=k3+1; x0=x; End x3=x; disp('the solution for gradient is '); disp(xx'); disp(' gradient iteration is '); disp(k); disp('the solution for newton is '); disp(x2'); disp('newton iteration is'); disp(k2); disp('the solution for BGFS is '); disp(x3’); disp('BFGS iteration is'); disp(k3);