32 lines
1.0 KiB
Matlab
32 lines
1.0 KiB
Matlab
function [gamma] = gamma_armijo(f, grad_f, dk, xk)
|
||
% Calculates the best step based on amijo method
|
||
%
|
||
% f(xk+ γk*dk) ≤ f(xk) + σ * γk * dk^T * ∇f(xk)
|
||
% γk = β*γk_0
|
||
%
|
||
% f: Objective function
|
||
% grad_fun: Gradient function of f
|
||
% dk: Current value of selected direction -∇f or -inv{H}*∇f or -inv{H + lI}*∇f
|
||
% xk: Current point (x,y)
|
||
|
||
|
||
% beta: beta factor in [0.1, 0.5]
|
||
% signam: sigma factor in (0, 0.1]
|
||
global amijo_beta
|
||
global amijo_sigma
|
||
|
||
gf = grad_f(xk);
|
||
gamma = 1; % Start with a step size of 1
|
||
|
||
% Perform Armijo line search
|
||
while f(xk + gamma * dk) > f(xk) + amijo_sigma * gamma * dk * gf
|
||
%while f(xk(1) + gamma * dk(1), xk(2) + gamma * dk(2)) > ...
|
||
% f(xk(1), xk(2)) + amijo_sigma * gamma * norm(dk)^2
|
||
gamma = amijo_beta * gamma; % Reduce step size
|
||
if gamma < 1e-12 % Safeguard to prevent infinite reduction
|
||
warning('Armijo step size became too small.');
|
||
break;
|
||
end
|
||
end
|
||
|
||
end |