У меня есть следующий код для метода оптимизации 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) произошла ошибка деления на ноль.
Когда алгоритм обновляет матрицу Гессиана, знаменатели так или иначе становятся равными нулю.Я не знаю почему.Это нормально или где-то ошибка?Спасибо!