function varargout = himmelblau(x)
% gibt Funktionswert, Gradient und Hessematrix der Himmelblaufunktion 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 globale Minima mit Funktionswert 0 bei
% (3, 2)
% (-2.8051, 3.1313)
% (-3.7793, -3.2832)
% (3.5844, -1.8481)
% und ein lokales Maximum bei
% (-0.2708,-0.9230)
%
% Markus Grasmair,
% Wien, April 2011

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

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

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

if nargout > 2
    % Hessematrix
    H = eye(2);
    H(1,1) = 12*X.^2 + 4*Y-42;
    H(1,2) = 4*X+4*Y;
    H(2,1) = H(1,2);
    H(2,2) = 12*Y.^2 + 4*X - 26;
    varargout{3} = H;
end
