% Loese das Problem min{ f(x) : x aus R^n } mittels des Verfahren
% des steilsten Abstiegs.
%
% Parameter:
% subprog	Funktion, um das eindimensionale Unterproblem zu loesen,
%				wobei [t, k] = subprog(u, du, ddu, t0, t1, epsilon)
%				mit t Loesung, k Iterationsanzahl;
%					u, du, ddu : R -> R, die Funktion und jeweiligen Ableitungen;
%					t0, t1 Intervalgrenzen
%					epsilon Genaurigkeitskonstante
% f			Zielfunktion mit f : R^n -> R
% df		Gradient von f (als Spalte geschrieben!)
% ddf		Hessematrix von f, wird nur von subprog verwendent.
% x			Startvektor
%
% epsilon	Genauerigkeitskonstante
%
% Rueckgabewerte:
% x		Minimalstelle
% k		Anzahl der Iterationen
%
% Das Verfahren berechnet nur die ersten 100 Iterationsschritte!!
%
function [x,k] = steepestDescent(subprog, f, df, ddf, x, epsilon);

K = 100;

for k = 1:K
	
    s = -df(x);
    
	if norm(s) < epsilon
		break;
	end;
	
	u = @(t) f(x + t*s);
	du = @(t) s'*df(x + t*s);
	ddu = @(t) s'*ddf(x + t*s)*s;
	
	[t, kk] = subprog(u, du, ddu, 0, 1, epsilon);
	
	x = x + t*s;
end

