Оптимизация Левенберга-Марквардта с использованием 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 в соответствии с градиентом целевой функции и гессианом? Как я могу улучшить этот алгоритм?

0 ответов

Другие вопросы по тегам