对于Matlab中的BFGS优化方法,我有以下代码。 我需要最小化以下功能:
f = x(1)^ 5-2 * x(1)^ 3 + x(2)^ 3-x(1)* x(2)^ 2-x(1)* x(2);function [x,k,fval]=myBFGS2(x,e,maxit)
if ~iscolumn(x)
error('the initial vector has to be a column vector');
end
if nargin<3
maxit=100;
end
k=0;
H=eye(length(x));
while norm(gr(x))>e
p=-H*gr(x);
a=backtr(0.5,1e-4,x,p,1);
xn=x+a*p;
k=k+1;
if k==maxit
error('The number of steps exceeded maxit');
end
H=hessematrix(xn,x,H);
x=xn;
XS(:,k+1)=x;
end
fval=fv(x);
end
% the objective function
function f=fv(x)
f = x(1)^5-2*x(1)^3+x(2)^3-x(1)*x(2)^2-x(1)*x(2);
end
%gradient
function g=gr(x)
g=[ 5*x(1)^4-6*x(1)^2-x(2)^2-x(2) ; 3*x(2)^2-2*x(1)*x(2)-x(1) ];
end
% the updating formula for H
function H=hessematrix(xn,x,H)
s=xn-x;
y=gr(xn)-gr(x);
H=(eye(size(H))-s*y'/dot(y,s))*H*(eye(size(H))-y*s'/dot(y,s))+s*s'/dot(s,y);
end
%the backtracking algorithm
function a=backtr(rho,c,xk,pk,a)
while fv(xk+a*pk)>fv(xk)+a*c*dot(gr(xk),pk)
a=rho*a;
end
end
如果我使用[1,1]初始点,则该算法运行良好,并返回了局部最小值。
我叫这个函数: myBFGS2(transpose([1,1]),0.001,100) 结果是:[1.2385,1.1765]
使用此调用:myBFGS2(transpose([2,2]),0.001,100)除以零错误。
当算法更新Hessian矩阵时,分母以某种方式变为零。我不知道为什么。这是正常现象还是某处存在错误? 谢谢!