%% Robuste lineare Regression: Anpassung einer Geraden an Datenpunkte
% Musterprogramm zu Kapitel 6.5 und Aufgabe 51 im Vorlesungsskriptum.
%
% Eingabe: Datenpunkte in der xy-Ebene als zweispaltige Matrix
%
% Ausgabe: Die Parameter a und b der Geradengleichung y=a+bx
%
% Die Parameter werden so bestimmt, dass die Summe der absoluten Fehler
% minimal wird. Diese Ausgleichsgerade ist weniger empfindlich
% gegen Ausreissern in den Daten als jene nach der Methode
% der kleinsten Quadrate.
%
% _CWB 2003,2006,2017_

function [a,b]=linregrob(daten)
x = daten(:,1); y = daten(:,2); %x- und y-Werte der Eingangsdaten

b0 = -10; % Anfangswerte fuer die Steigung der Geraden
b1 = 10;  % (sind gegebenenfalls zu aendern!)
if f(b0)*f(b1)>0
    error('mit den gegebenen Anfangswerten der Steigung ist keine Loesung moeglich!');
end

b = fzero(@f, [b0  b1]); % (a wird dabei bereits in der subfunction berechnet)


%% Nested subfunktion, deren Nullstelle die gesuchte Steigung bestimmt
    function eps = f(b)
        a=median(y-b*x);
        eps=sum(x .* sign(y - a - b*x));
    end

end