Квази Ньютоновская оптимизация для функции - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь реализовать метод Quasi Newton для оптимизации функции. код до сих пор имеет две проблемные c проблемы, которые я указал в скрипте (где нужно вычислить альфа, а также обновить B и Binve), может кто-нибудь помочь мне реализовать формулы, упомянутые в Optimization_problem так что я могу запустить скрипт успешно. Вот что у меня так далеко. Большое спасибо!

clc;clear;
% objective function, its gradient and Hessian
f = @(x1,x2) -4*x1 - 2*x2 - x1.^2 + 2*x1.^4 - 2*x1.*x2 + 3*x2.^2;
Gradient = @(x) [-4-2*x(1)+8*x(1)^3-2*x(2);  -2-2*x(1)+6*x(2);];
%Hessian  = @(x) [-2+24*x(1)^2, -2; -2; 6];

% plot contour lines
[X, Y] = meshgrid(-0.25:0.01:1.75, -0.25:0.0025:1.75); 
contour(X,Y,f(X,Y),[-4.34 -4.3 -4.2 -4.1 -4.0 -3 -2 -1 0],'ShowText','On'), hold on; 
grid on;

% initialization
x0 = [0; 0;];  
df0 = Gradient(x0);
B = eye(2);
invB = eye(2);

% store intermediate points
Xs(:,1) = x0;

for i = 1:500
    % compute step size "alpha"
    %
    % %% problematic part 

    % update x
    x1 = x0 - alpha*invB*df0;
    df1 = Gradient(x1);
    fprintf('It. %i: f(%e,%e) = %e.\n', i, x1(1), x1(2), f(x1(1),x1(2)));
    Xs(:,i+1) = x1;

    % check the stopping criterion.
    if norm(x1-x0)/norm(x1)<1e-4
        break;
    end

    % update B and invB
    %
    %problematic part 
    %

    % update x0 and df0
    x0  = x1;
    df0 = df1;
end
plot(Xs(1,:), Xs(2,:),'o-');
daspect([1 1 1]);
hold off;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...