You are on page 1of 10

function [ x_min, fx_min ] = OptMetPowell( X_ini, fx, grafx, hessfx )

epsilon = 1-e8;
gamma = 3;
k=0;
Xk = X_ini;
fxk = feval(fx, Xk);
Gradfxk = feval(grafx, Xk);
Hessfxk = feval(hessfx, Xk);
SN = -Hessfxk\Gradfxk;
SG = -Gradfxk;
magSN = norm(SN);
magSG = norm(SG);
beta = (norm(Gradfxk))^2/(Gradfxk'*Hessfxk*Gradfxk);
eta = (gamma-beta*magSG)/(magSN-beta*magSG);
if gamma<=beta*magSG
S = gamma/magSG*SG;
elseif gamma<magSN
S = eta*SN+(1-eta)*beta*SG;
else
S = SN;
end
magGrad = norm(Gradfxk);
while magGrad > epsilon
k=k+1; %Generalización
Xk = Xk+S; %Generalización
fxk = feval(fx, Xk);
Gradfxk = feval(grafx, Xk);
Hessfxk = feval(hessfx, Xk);
SN = -Hessfxk\Gradfxk;
SG = -Gradfxk;
magSN = norm(SN);
magSG = norm(SG);
beta = (norm(Gradfxk))^2/(Gradfxk'*Hessfxk*Gradfxk);
eta = (gamma-beta*magSG)/(magSN-beta*magSG);
if gamma<=beta*magSG
S = gamma/magSG*SG;
elseif gamma<magSN
S = eta*SN+(1-eta)*beta*SG;
else
S = SN;
end
magGrad = norm(Gradfxk);
end
end

You might also like