function [x] = steepest_descent(fun,xstart);
% function x = steepest_descent(fun,xstart)
% Verfahren des steilsten Abstiegs
%
% fun - Handle auf Funktion der Form 
%       [val,grad] = function_name(point)
%            val  - Funktionswert im Punkt point
%            grad - Gradient im Punkt point
% xstart - Startpunkt
% x      - Matrix mit der Folge der Iterationspunkte als Spaltenvektoren


c1 = 10^-4;
c2 = 0.9;

xpoint = xstart;
[xval,xgrad] = feval(fun,xpoint); 

maxa = 2; 
k = 1;						% Iterationszähler
while((norm(xgrad) > 10^-5) && (k < 100))	% Abbruch falls Norm des Gradienten zu klein, bzw. zu viele Iterationen
    [npoint,nval,ngrad,nt] = linesearch(fun,xpoint,-xgrad,maxa,xval,xgrad,c1,c2);
    l = 1;					% Iterationszähler
    while (nt == 0 && l < 100)%
        maxa = 2*maxa;
        [npoint,nval,ngrad,nt] = linesearch(fun,xpoint,-xgrad,maxa,xval,xgrad,c1,c2);
        l = l+1;
    end
    maxa = norm(npoint-xpoint)/norm(xgrad);
    x(:,k) = npoint;
    xpoint = npoint;
    xval = nval;
    xgrad = ngrad;
    k = k+1;
end

if k==100
    disp('100 Iterationen durchlaufen: Abbruch')
end
    


