使用BFGS方法进行功能优化

时间:2019-04-02 18:52:55

标签: matlab optimization

对于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矩阵时,分母以某种方式变为零。我不知道为什么。这是正常现象还是某处存在错误? 谢谢!

0 个答案:

没有答案