function x=Gradientenverfahren(x,f,Df)

sigma=1e-4; %Parameter Armijo-Liniensuche
beta=0.5;
eps=1e-4; %Fehlertoleranz Abbruchkriterium
kmax=1e5; %5; %max. Schritte in Gradientenrichtung
alphamin=1e-4; %minimale Schrittweite (ergibt Maximalzahl an Armijo-Iterationen)
k=0;
fcount=0; %zaehlt Funktionsauswertungen
Dfcount=0; %zaehlt Gradientenauswertungen

%Ausgabe #Schritte, Schrittweite, Abbruchkriterium, Zwischenwert, #Funktions-/Gradientenauswertungen
%fprintf('%5.0f %6.4f %12.7f %12.7f %12.7f %6.0f %6.0f\n',k,alpha,term,x(1),x(2),fcount,Dfcount);
fprintf('    k  alpha         term         x(1)         x(2) fcount Dfcount \n');

fx=feval(f,x);
fcount=fcount+1;
nablafx=feval(Df,x);
Dfcount=Dfcount+1;
term=norm(nablafx); %fuer Abbruchkriterium

while term > eps && k<=kmax %Gradientenverfahren
       
    alpha=1;
    fxalphad=feval(f,x-nablafx);
    fcount=fcount+1;
    while fxalphad > fx -alpha*sigma*term^2 && alpha > alphamin %Armijo-Liniensuche
        alpha=alpha*beta;
        fxalphad=feval(f,x-alpha*nablafx);
        fcount=fcount+1;
    end
    x=x-alpha*nablafx; %Update
    fx=fxalphad; %letzter Funktionswert wird angenommen
    nablafx=feval(Df,x);
    Dfcount=Dfcount+1;
    term=norm(nablafx); %fuer Abbruchkriterium
    k=k+1;
    %Ausgabe #Schritte, Schrittweite, Abbruchkriterium, Zwischenwert, #Funktions-/Gradientenauswertungen
    %if mod(k, 25) == 0 %falls k durch 100 teilbar Pause zur Ansicht der Ausgabe beim Testen
    %    pause
    %    fprintf('    k  alpha         term         x(1)         x(2) fcount Dfcount \n');
    %end
    fprintf('%5.0f %6.4f %12.7f %12.7f %12.7f %6.0f %6.0f\n',k,alpha,term,x(1),x(2),fcount,Dfcount);
end
fprintf('\n')
end
