Оптимизация Левенберга-Марквардта с использованием Matlab
Я пытаюсь свести к минимуму функцию Леви: [1]: https://www.sfu.ca/~ssurjano/levy13.html используя алгоритм LM. алгоритм использует гессенскую матрицу, которая предназначена для минимизации любой функции, а не только наименьших квадратов. вот мои коды:
function x=LM_core(x,beta,fg,fh)
% fg is the gradient at point x.
% fh is the Hessian at point x
n=length(x);
pos_def = beta*eye(n);
sdum = fh + pos_def;
s = -sdum\fg; % calculating the inverse matrix using the linear solver.
lambda = 1;
x = x + lambda*s;
end
Основная функция:
function [xmin,fxmin,iter,err1,err2,err3]=lm_opt(x0,tol,f,f_g,f_h)
% Three function handles: f for Objective funciton, f_g for gradient and f_h for Hessian
% ------------------------Pre-initialization------------------------------
itermax=1e5;
beta=1e3;
LL=0.25;
HH=2;
%-------------------------------------------------------------------------
x0=x0(:); x=x0;
for iter=1:itermax
xold=x;
fold = f(x);
fg = f_g(x); %gradient
fh = f_h(x); %Hessian
x = LM_core(x,beta,fg,fh); % Calculate the next point using LM method.
fnew = f(x);
if fnew < fold
beta= LL*beta;
err1=norm(fg);
err2=abs(fnew-fold);
err3=norm(x-xold);
if err1<tol && err2<tol && err3<tol
xmin=x;
fxmin=f(xmin);
break;
end
else
beta=HH*beta;
x=xold;
end
end
матрицы градиента и гессиана доступны аналитически. Я сталкиваюсь со следующей ошибкой, когда использую начальное предположение = [1, 1]. Предупреждение: Матрица является единственной, близкой к единственной или плохо масштабируемой. Результаты могут быть неточными. RCOND = NaN. как я могу преодолеть эту проблему? Есть ли способ инициализации бета, LL и HH в соответствии с градиентом целевой функции и гессианом? Как я могу улучшить этот алгоритм?