Оптимизация функций с использованием метода BFGS - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть следующий код для метода оптимизации BFGS в Matlab.Мне нужно минимизировать следующую функцию:

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) произошла ошибка деления на ноль.

Когда алгоритм обновляет матрицу Гессиана, знаменатели так или иначе становятся равными нулю.Я не знаю почему.Это нормально или где-то ошибка?Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...