Безусловная оптимизация с использованием метода градиента + поиск по линии возврата - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь использовать метод градиента + обратный поиск строки из кода Matlab для сходимости следующей функции:

FUnction

У меня возникли проблемы с реализациейпоиск по обратной линии на мой метод градиента.Ниже мой код:

function [xopt,fopt,niter,gnorm,dx] = grad_descent(varargin)

% define starting point
x0 = [10 10]';

% termination tolerance
tol = 1e-6;

% maximum number of allowed iterations
maxiter = 100;

% minimum allowed perturbation
dxmin = 1e-6;

% step size 
alpha = 0.1;

% initialize gradient norm, optimization vector, iteration counter, perturbation
gnorm = inf; x = x0; niter = 0; dx = inf;

% define the objective function:
f = @(x1,x2) exp(x1+3*x2-0.1) + exp(x1-3*x2-0.1) + exp(-x1-0.1);

% plot objective function contours for visualization:
figure(1); clf; ezcontour(f,[-5 5 -5 5]); axis equal; hold on

% redefine objective function syntax for use with optimization:
f2 = @(x) f(x(1),x(2));

% gradient descent algorithm:
while and(gnorm>=tol, and(niter <= maxiter, dx >= dxmin))
% calculate gradient:
g = grad(x);
gnorm = norm(g);
% take step:
xnew = x - alpha*g;
% check step
if ~isfinite(xnew)
    display(['Number of iterations: ' num2str(niter)])
    error('x is inf or NaN')
end
% plot current point
plot([x(1) xnew(1)],[x(2) xnew(2)],'ko-')
refresh
% update termination metrics
niter = niter + 1;
dx = norm(xnew-x);
x = xnew;

end
xopt = x;
fopt = f2(xopt);
niter = niter - 1;

% define the gradient of the objective
function g = grad(x)
g = [-exp(-x(1)-.1)+exp(x(1)-3*x(2)-.1)+exp(x(1)+3*x(2))
-3*exp(x(1)-3*x(2)-.1)+3*exp(x(1)+3*x(2)-.1)];

% Compute the gradient using center difference formula
function df = difopc(x)
n = length(x);
dx = 1e-4;
for (k = 1:1:n)
xp = x;
xm = x;
xp(k) = x(k) + dx;
xm(k) = x(k) - dx;
df(k) = 1/2/dx*(opc(xp) - opc(xm));
df    = df(:);
end

return;

Я не уверен, правильно ли я вычисляю градиент.Кажется, мои первоначальные догадки могут быть неверными?Или, может быть, использование другой формулы центра неправильно используется в коде?

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