function x=Newtonverfahren(x,f,Df,D2f)

sigma=1e-4; %Parameter Armijo-Liniensuche
beta=0.5;
eps=1e-12; %Fehlertoleranz Abbruchkriterium
p=2.1; %Parameter Loesung Newton-LGS sinnvoll
rho=1e-8;
kmax=1e5; %max. Schritte in Newtonrichtung
alphamin=1e-4; %minimale Schrittweite (ergibt Maximalzahl an Armijo-Iterationen)
k=0;
fcount=0; %zaehlt Funktionsauswertungen
Dfcount=0; %zaehlt Gradientenauswertungen
D2fcount=0; %zaehlt Hesse-Matrix-Auswertungen

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

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

while term > eps && k<=kmax %Newtonverfahren (glob.)
    Hf=feval(D2f,x);
    D2fcount=D2fcount+1;
    if condest(Hf) > 1e+15
        d=-nablafx;
        condest(Hf)
        pause
    else
        d=-Hf\nablafx;
        if nablafx'*d > -rho*norm(d)^p
            d=-nablafx;
            d
            pause
        end
    end       
    alpha=1;
    fxalphad=feval(f,x+d);
    fcount=fcount+1;
    nfd=sigma*nablafx'*d;
    while fxalphad > fx +alpha*nfd && alpha > alphamin %Armijo-Liniensuche
        alpha=alpha*beta;
        fxalphad=feval(f,x+alpha*d);
        fcount=fcount+1;
    end
    x=x+alpha*d; %Update
    fx=fxalphad; %letzter Funktionswerte wird angenommen
    nablafx=feval(Df,x);
    Dfcount=Dfcount+1;
    term=norm(nablafx); %fuer Abbruchkriterium
    k=k+1;   
    %Ausgabe #Schritte, Schrittweite, Abbruchkriterium, Zwischenwert, #Funktions-/Gradienten-/Hesse-Matrix-Auswertungen
    %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 D2fcount \n');
    %end
    fprintf('%5.0f %6.4f %12.7f %12.7f %12.7f %6.0f %6.0f %6.0f\n',k,alpha,term,x(1),x(2),fcount,Dfcount,D2fcount);
end
fprintf('\n')
end
