function varargout = rosenbrock(x)
% gibt Funktionswert, Gradient und Hessematrix der Rosenbrockfunktion aus
%
% Eingabe:
%   x...2-dimensionaler Vektor
%
% Ausgabe:
%   varargout:
%   1. Argument: Funktionswert (Skalar)
%   2. Argument: Gradient (2 x 1 Vektor)
%   3. Argument: Hessematrix (2 x 2 Matrix)
%
% Gradient und Hessematrix werden nur berechnet, wenn sie tatsaechlich
% benoetigt werden.
%
% Die Funktion besitzt ein eindeutiges Minimum bei (1,1)
% 
% Markus Grasmair,
% Wien, April 2011

X = x(1);
Y = x(2);

% Funktionswert
varargout{1} = (1-X).^2 + 100*(Y-X.^2).^2;

if nargout > 1
    % Gradient
    g = zeros(2,1);
    g(1) = -2*(1-X) - 400*(Y-X.^2).*X;
    g(2) = 200*(Y-X.^2);
    varargout{2} = g;
end

if nargout > 2
    % Hessematrix
    H = eye(2);
    H(1,1) = 2 - 400*Y + 1200*X.^2;
    H(1,2) = -400*X;
    H(2,1) = H(1,2);
    H(2,2) = 200;
    varargout{3} = H;
end
