function [x,f] = Grad_Conjugados_unc(fun,x,par)
% Método de los gradientes conjugados para minimizar f(x)
%
 rho = 0.01; beta = 0.1;                            % Parámetros de line search
 maxit = 1000; 
 [f,g]= fun(x); ppr=-g; gpr=g; pbeta=0;             % Comienzo con máx. pendiente
 for i=1:maxit                                      % Proceso iterativo
    if i>1
       [f,g] = fun(x);
       if   par==1, pbeta=(g'*g)/(gpr'*gpr);        % Fletcher-Reeves
       else         pbeta=((g-gpr)'*g)/(gpr'*gpr);  % Polak-Rivière
       end
    end
    p = -g+pbeta*ppr;
    if (norm(g,inf) < 1e-6), break, end             % Condición de mínimo
    alpha = 1;
    for k=1:10                                      % Backtracking 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; ppr=p; gpr=g;
    fprintf('%4.0f %13.8e %13.8e %13.8e %13.8e\n',i,x,f,alpha);
 end
end
   
function [f,g] = objfun_min3(x)    % Rosenbrock
 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)];
end