废话不多说,直接上题解!!!
分别编写最速下降法、阻尼Newton法、共轭梯度法、BFGS算法的程序求解第三章课后第20题。
function f = fun(x)
f=100*(x(2)-x(1)^2)^2+(x(1)-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
function He = Hess( x )
He=[1200*x(1)^2-400*x(2)+2,-400*x(1);-400*x(1),200];
end
function [ k,x,val ] = grad( fun,gfun,x0,epsilon )
maxk=5000;
beta=0.5; sigma=0.4;
k=0;
while(k
运行结果如下,其中 k 为迭代次数,x 为最优解, val 为最优值。
function [ k,x,val ] = zuninewton( fun,gfun,x0,epsilon )
maxk=5000;
beta=0.5; sigma=0.4;
k=0;
while(k
运行结果如下,其中k为迭代次数,x为最优解,val为最优值。
function [ k,x,val ] = frcg( fun,gfun,x0,epsilon,N )
if nargin<5,N=1000;end
if nargin<4,epsilon=1e-4;end
beta=0.6;sigma=0.4;
n=length(x0);k=0;
while(k=0),dk=-gk;end
end
if(norm(gk)
运行结果如下,其中k为迭代次数,x为最优解,val为最优值,N为最大循环次数。
function [ k,x,val ] = bfgs( fun,gfun,x0,varargin )
N=1000;
epsilon=1e-4;
beta=0.55;sigma=0.4;
n=length(x0);Bk=eye(n);
k=0;
while(k
运行结果如下,其中k为迭代次数,x为最优解,val为最优值。
第四章课后第9题(编写程序)
7(2)程序如下:
function f_x = fun7_2( x )
f_x=-x(1)*x(2);
end
function gi_x = gi7_2( x,i )
switch i
case 1
gi_x=-(-x(1)-x(2)^2+1);
case 2
gi_x=-(x(1)+x(2));
otherwise
end
end
function sumt = sumtfun7_2( x,M )
sumt=fun7_2(x);
for i=1:2
sumt=sumt+M*max(0,gi7_2(x,i))^2;
end
end
function sumtgfun = sumtgfun7_2( x,M )
sumtgfun=[-x(2);-x(1)];
if(gi7_2(x,1)>0)
sumtgfun=sumtgfun+M*[2*(x(1)+x(2)^2-1);2*x(2)*2*(x(1)+x(2)^2-1)];
end
if(gi7_2(x,2)>0)
sumtgfun=sumtgfun+M*[2*(x(1)+x(2));2*(x(1)+x(2))];
end
end
function [ k,x,val,t ] = SUMT7_2( x0,M )
epsilon=1e-3;
c=2;k=1;
while(k<50)
[~,xi,~]=bfgs('sumtfun7_2','sumtgfun7_2',x0,M);
t1=gi7_2(xi,1);
t2=gi7_2(xi,2);
t=max(t1,t2);
if(t
运行结果如下,其中k为迭代次数,x为最优解,val为最优值,M为惩罚因子,t用于判断迭代是否停止。
7(3)程序如下:
function f_x = fun7_3( x )
f_x=4*x(1)-x(2)^2-12;
end
function he = hf7_3( x )
he=25-x(1)^2-x(2)^2;
end
function gi_x = gi7_3( x,i )
switch i
case 1
gi_x=-(10*x(1)-x(1)^2+10*x(2)-x(2)^2-34);
case 2
gi_x=-x(1);
case 3
gi_x=-x(2);
otherwise
end
end
function sumt = sumtfun7_3( x,M )
sumt=fun7_3(x)+M*hf7_3(x)^2;
for i=1:3
sumt=sumt+M*max(0,gi7_3(x,i))^2;
end
end
function sumtgfun = sumtgfun7_3( x,M )
sumtgfun=[4;-2*x(2)]+M*[-2*x(1)*2*(25-x(1)^2-x(2)^2);-2*x(2)*2*(25-x(1)^2-x(2)^2)];
if(gi7_3(x,1)>0)
sumtgfun=sumtgfun+M*[(10-2*x(1))*2*(10*x(1)-x(1)^2+10*x(2)-x(2)^2-34);(10-2*x(2))*2*(10*x(1)-x(1)^2+10*x(2)-x(2)^2-34)];
end
if(gi7_3(x,2)>0)
sumtgfun=sumtgfun+M*[2*x(1);0];
end
if(gi7_3(x,3)>0)
sumtgfun=sumtgfun+M*[0;2*x(2)];
end
end
function [ k,x,val,t ] = SUMT7_3( x0,M )
epsilon=1e-3;
c=2;k=1;
while(k<50)
[~,xi,~]=bfgs('sumtfun7_3','sumtgfun7_3',x0,M);
t1=hf7_3(xi);
t2=gi7_3(xi,1);
for i=2:3
t2=max(t2,gi7_3(xi,i));
end
t=max(t1,t2);
if(t
运行结果如下,其中k为迭代次数,x为最优解,val为最优值,M为惩罚因子,t用于判断迭代是否停止。