function  [x,f,i] = Newton_mp(fun,x)
% Método híbrido Newton-máxima pendiente
%
 global h
 rho = 0.1; beta = 0.5; % Parámetros de line search
 maxit = 100; h=sqrt(eps);
 for i=1:maxit          % Proceso iterativo
   [f,g,H] = fun(x);
   [R,npd]  = chol(H); % Cholesky comprueba si H es definida positiva
   if ~npd
      p = -R\(R'\g);   % Dirección de Newton_mp
   else
      p = -g;          % Dirección de máxima pendiente
   end
   if abs(p'*g)<1e-8, break, end
   alpha = 1;
   for k=1:10          % Backtracking de amplitud de paso
      xnew = x+alpha*p;
      fxnew = fun(xnew);
      if fxnew < f+alpha*rho*g'*p, break
      else alpha=alpha*beta;
      end
   end
   x = x + alpha*p;
   fprintf('%3.0f %13.5e %13.5e %13.5e %13.5e %2.0f\n',i,x,f,alpha,npd);
 end
end

function [f,g,H] = objfun_min3(x)
% Función de Rosenbrock: 100(x2-x1^2)^2+(1-x1)^2 
 global h
 f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2; if nargout<2, return, end
 g = [-200*(x(2)-x(1)^2)*2*x(1)-2*(1-x(1));200*(x(2)-x(1)^2)];
 if nargout<3, return, end
 x1=[x(1)+h;x(2)]; [~,g1]=objfun_min3(x1);
 H(1:2,1)=(g1-g)/h;
 x1=[x(1);x(2)+h]; [~,g1]=objfun_min3(x1);
 H(1:2,2)=(g1-g)/h;
end
