function main(doGradientenVerfahren)

% Der Funktionsparameter entscheidet darüber, welches Verfahren
% verwendet werden soll:
% Falls doGradientenVerfahren == true:  benutze Gradientenverfahren
% Falls doGradientenVerfahren == false: benutze Newtonverfahren


%
%                Intitialisierung
%


% Beim Gradientenverfahren werden wir die Schrittweite durch
% die Armijo-Regel berechnen:
if doGradientenVerfahren
	doSchrittweitenSteuerung = true;   % Schrittweitensteuerung erwünscht
	Verfahren = 'Gradientenverfahren'; % Name des Verfahrens

	beta = 0.5;               % Regel-Armijo Konstanten
	sigma = 0.5;              %
	alpha_max = 0.5;          %

else
	doSchrittweitenSteuerung = false;
	Verfahren = 'Newton-Verfahren';
end


x=[??;??];                   % Startwert für Rosenbrock-Funktion
epsilon = 1.0e-11;           % Genauigkeit für Abbruchsbedingung
k = 0;                       % Iterations-Counter
grad = grad_f(x);            % Gradient in der 0-ten Iteration

if doGradientenVerfahren     % Suchrichtung p0 je nach Verfahren
	p = ??*grad;             % Gradienentverfahren
else
	p = ??*(hess_f(x)\grad); % Newton
end


%
%                Anfang
%

fprintf(' Das Minimum wird per %s berechnet.\n', Verfahren);

%
%                Iteration
%


while norm(grad) > epsilon       % solange bis Gradient "nahe" bei 0 ist

	% Wenn das Produkt von Suchrichtung und Gradienten >= 0 ist,
	% haben wir keine Suchrichtung mehr.  Breche Programm ab.
	if p*transpose(grad) >= 0
		disp('Es konnte keine Suchrichtung ermittelt werden!');
		break;
	end




	% Schrittweitensteuerung
	% Die Schrittweite wird per Armijo-Regel ermittelt oder 1 gesetzt

	if doSchrittweitenSteuerung
		% Berechnung der Schrittweite per Armijo-Regel:
		l=0;
		while (f(x+alpha_max*beta^l*p)-f(x) > sigma*alpha_max*beta^l*transpose(grad)*p)
			l=l+1;
		end
		alpha = alpha_max*beta^l;
	else
		alpha = 1;
	end
	% Ende Schrittweitensteuerung




	% Iterationsschritt

	x = x + alpha*p;              % der Iterationsschritt
	k=k+1;

	grad = grad_f(x);             % neuer Gradient für x(k+1)

	% Die neue Suchrichtung:
	if doGradientenVerfahren
		p = ??*grad;               % Gradientenverfahren
	else
		p = ??*(hess_f(x)\grad);   % Newton
	end

end  % nächste Iteration


fprintf('Minimum: x = (%d,%d), f(x) = %d\n',x(1), x(2), f(x));
fprintf('Norm des Gradienten: %d\n', norm(grad_f(x)));
fprintf('Anzahl der Iterationen: %d\n', k);

x;

%
%                Ende
%



% Rosenbrock Funktion
function func = f(x)
func = ??;

% Gradient
function func = grad_f(x)
func(1,1) = ??;
func(2,1) = ??;

% Hessematrix
function func = hess_f(x)
func(1,1) = ??;
func(1,2) = ??;
func(2,1) = ??;
func(2,2) = ??;


