% Loese das Problem min{ f(x) : x aus M } mittels Strafkostenverfahrens.
% Das unrestringierte Unterproblem wird mit steilsten Abstieg + Bisektion
% gelšst (Alternativen bei C^1 Funktionen: cg-Verfahren, BFGS, usw.).
%
% Parameter:
% f		Zielfunktion mit f : R^n -> R
% df	Gradient von f (als Spalte geschrieben!)
% p		Strafterm zur M, d.h. p : R^n -> R mit
%			p(x) = 0, wenn x aus M
%			P(x) > 0, wenn x nicht aus M
% dp	Gradient von p
% r		Folge aus R mit r_{k+1} > r_k > 0 fuer alle k
%			(als Funktion geschrieben!)
% x		Evtl. Startvektor fuer die unrestringierte Minimierung
%
% epsilon	Genauerigkeitskonstante
%
% Rueckgabewerte:
% x		Minimalstelle
% k		Anzahl der Iterationen
%
% Das Verfahren berechnet nur die ersten 25 Iterationsschritte!!
%
function [x,k] = strafkosten(f, df, p, dp, r, x, epsilon);

K = 25;

% -------------------------------------------------

for k = 1:K,
	
	% Strafkostenfunktion Phi definieren:

	phi = @(x) f(x) + r(k)*p(x);
	dphi = @(x) df(x) + r(k)*dp(x);
	
	
	% Loese das Minimierungsproblem
	% min{ phi(x) : x aus R^n }
	% Hier mit steilsten Abstieg + Bisektion
	
	[x,kk] = cg(@bisection, phi, dphi, @(x)0, x, epsilon^2);
	
	% Ist p(x) = 0, genau dann wenn, x zulŠssiger Punkt.
	% Dann ist x bereits eine Loesung von
	% min{ f(x) : x aus M }
	
	if p(x) < epsilon
		break;
	end
end
