第一题(牛顿法和不精确一维搜索)
牛顿法: syms x1 x2;
f=(x2-(x1)*(x1))^2+(1-x1)^2; v=[x1,x2];
df=jacobian(f,v); df=df.';
G=jacobian(df,v);
epson=1e-12;x0=[0,1]';g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});k=0;mul_count=0;sum_count=0; 文档来自于网络搜索 mul_count=mul_count+12;sum_count=sum_count+6; while(norm(g1)>epson) p=-G1\\g1; x0=x0+p;
g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)}); G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)}); k=k+1;
mul_count=mul_count+16;sum_count=sum_count+11; end; k x0
mul_count sum_count 运行结果:
k = 9 x0 = 1 1
mul_count = 156
sum_count = 105
不精确一维搜索: fun1.m文件
function f=fun1(x)
f=(x(1)-1)^2+(x(2)-x(1)^2)^2;
gfun1.m文件
1 / 13
function gf = gfun1(x)
gf=[2*x(1)*(x(1)^2-x(2))+2*(x(1)-1),2*(x(2)-x(1)^2)]';文档来自于网络搜索 wolfepowell.m文件
function [k,m,opt,x]=wolfepowell(xk,sk) max=1000;
c1=0.1; c2=0.6;a=0;b=inf;dk=0.2;m=0; while(m<=max)
if (fun1(xk)-fun1(xk+sk*dk)<-c1*dk*gfun1(xk)'*sk) b=dk;dk=(dk+a)/2; elseif
(fun1(xk)-fun1(xk+sk*dk)>=-c1*dk*gfun1(xk)'*sk)&&(gfun1(xk+sk*dk)'*sk if 2*dk<(dk+b)/2 dk=2*dk; else dk=(dk+b)/2; end else mk=m; break; end m=m+1; end m=mk;k=dk;x=xk+sk*dk;opt=fun1(x); 运行结果: >> xk=[0,1]';sk=[1,-1]'; [k,m,opt,x]= wolfepowell(xk,sk) k = 0.8000 m = 2 opt = 1.0080 x = 0.8000 0.2000 第二题(共轭梯度法) frcg.m文件 function [x,val,k]=frcg(fun,gfun,x0) maxk=5000; rho=0.6;sigma=0.4; 2 / 13 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) if(feval(fun,x0+rho^m*d) 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); fun.m文件 function f=fun(x) f=x(1)^2-2*x(1)*x(2)+2*x(2)^2+x(3)^2+x(4)^2-x(2)*x(3)+2*x(1)+3*x(2)-x(3);文档来自于网络搜索 gfun.m文件 function gf=gfun(x) gf=[2*x(1)-2*x(2)+2, -2*x(1)+4*x(2)+3,2*x(3)-x(2)-1,2*x(4)]';文档来自于网络搜索 运行结果: >>x0=[0 0 0 0]'; [x,val,k]=frcg('fun','gfun',x0) 3 / 13 x = -3.4064 -2.6515 -0.7032 0 val = -7.8338 k = 5000 第三题(BFGS法、最速下降法和牛顿法) fun3.m文件 function f=fun3(x) f=(x(1)-1)^2+5*(x(2)-x(1)^2)^2; gfun3.m文件 function gf = gfun3(x) gf=[20*x(1)*(x(1)^2-x(2))+2*(x(1)-1),10*(x(2)-x(1)^2)]';文档来自于网络搜索 Hessen.m文件 function Hess=Hessen(x) Hess=[60*x(1)^2-20*x(2)+2,(-20)*x(1);(-20)*x(1),10];文档来自于网络搜索 Steepest.m文件 function [m,opt,x] = Steepest(xk) m=0;Eps=1.0e-4;max=1000; while(m dk=wolfepowell(xk,sk); x=xk+dk*sk; g0=gfun3(x); if(norm(g0)<=Eps) break; else xk=x; end m=m+1; end mk=m; x=xk; opt=fun3(xk); 4 / 13 newton.m文件 function [x,opt,mk] = newton(xk) m=0;Eps=1e-4;max=100;H=[1,0;0,1]; while(m dk=wolfepowell(xk,sk); x=xk+dk*sk; g0=gfun3(x); if(norm(g0)<=Eps) break; else xk=x; end m=m+1; end mk=m; x=xk; opt=fun3(xk); bfgs.m文件 function [x,opt,mk] = bfgs(xk) m=0;Eps=1e-4;max=100;H=[1,0;0,1]; while(m dk=wolfepowell(xk,sk); x=xk+dk*sk; g0=gfun3(x); if(norm(g0)<=Eps) break; else H=H+((1+((g0-g)'*H*(g0-g))/((x-xk)'*(g0-g)))*(x-xk)*(x-xk)'-H*(g0-g)*(x-xk)'-(x-xk)*(g0-g)'*H)/((x-xk)'*(g0-g));文档来自于网络搜索 xk=x; end m=m+1; end mk=m; x=xk; 5 / 13
相关推荐: