Aufgabe 2.5 – Himmelblau-Funktion

 

Die Himmelblau-Funktion wird häufig als Testkriterium für Algorithmen zur nichtlinearen Optimierung verwendet. Die zweidimensionale Funktion ist definiert als
f:{\mathbb{R}^2} \to \mathbb{R},\quad f\left( {{x_1},{x_2}} \right) = {\left( {x_1^2+{x_2}-11} \right)^2}+{\left( {{x_1}+x_2^2-7} \right)^2}

  1. Schreiben Sie eine MATLAB Funktion y=fhimmelblau(x1, x2), die die Himmelblau- Funktion nach der obigen Formel berechnet! (Hinweis: Achten Sie darauf, dass Ihre Funktion auch dann korrekte Werte liefert, wenn die Parameter x1 und x2 Vektoren oder Matrizen sind!)
  2. Erstellen Sie ein Script himmelblau.m, das die Himmelblau-Funktion im Bereich -5 \leq {x_1},{x_2} \leq 5 mit der Schrittweite 0.05 durch Aufruf der Funktion aus a) berechnet und das Ergebnis wie gezeigt als 3D-Flächengrafik darstellt. Zwischen den einzelnen Stützpunkten soll dabei möglichst weich interpoliert werden. Versehen Sie Ihre Abbildung mit einem geeigneten Titel und mit den passenden Achsenbeschriftungen.

    himmelblau-funktion-3d-plot

  3. Zur Verdeutlichung der vier globalen Minima der Himmelblau-Funktion sollen alle Funktionswerte f\left( {{x_1},{x_2}} \right) \geq K in der Darstellung auf den Maximalwert K begrenzt werden können, wobei K eine beliebig wählbare positive Zahl ist. Wandeln Sie Ihr Script dazu in eine Funktion um, der die Konstante K optional als Parameter übergeben werden kann! Wird die Funktion ohne Parameter aufgerufen, soll die Darstellung unverändert wie in b) erfolgen. Für K \leq 0 soll das Programm mit der Fehlermeldung “invalid parameter K, must be positive“ beendet werden. Binden Sie fhimmelblau() als lokale Funktion in himmelblau() ein!

    Beispiel: >> himmelblau(50) ergibt

    himmelblau-funktion-3d-plot-begrenzt-parameter

Lösung

function himmelblau(K)
	[x1 x2]=meshgrid(-5:.05:5);
	y=fhimmelblau(x1,x2);
	if nargin==1
		if K<=0
			error('invalid parameter K, must be positive')
		end
		y(y>K)=K;
	end
	figure(1)
	surf(x1,x2,y)
	shading interp
	title('Himmelblau-Funktion')
	xlabel('x1')
	ylabel('x2')
	zlabel('f(x1,x2)')

	% lokale Funktion(en) -------------------------------
	function y=fhimmelblau(x1,x2)
	y=(x1.^2+x2-11).^2+(x1+x2.^2-7).^2;
end