% Nichtlineares Fitten:
% Dieses Skript demonstriert, wie beliebige Funktion an Messdaten gefittet
% werden k nnen. Das verwendete Verfahren ist iterativ.
   %  Dieses Skript kann beliebig bearbeitet werden.
%   Dazu muss Teil 1 durch die eigenen Messdaten ersetzt werden.


% TEIL 1 %
   % Erzeuge Daten. Hier: f(x) = a + b * sin(c*x) + Zufallszahlen

    % Koeffizienten von f(x) definieren
    a = 1.;
b = 2.;
c = 2*pi;

% Daten erstellen
n = 100; % Anzahl der Datenpunkte
x_data = linspace(0, 1, n); % x-Werte
y_data = a + b * sin(c * x_data) + random('Normal',0,0.2,1,n); % Funktionswerte

% TEIL 2 %
% Nichtlineares Fitten
% funktioniert iterativ, d.h. ein Satz von Fitparametern muss "geraten" 
% werden. Diese werden dann schrittweise verbessert.
% Das Verfahren muss nicht konvergieren! Ggf. Anfangswerte variieren.

  % definiere Fitfunktion F(x)
  % Vektor c enth lt die zu bestimmenden Parameter
  % Vektor x_in ist das eigentliche Argument der Funktion
  F = @(c,xdata) c(1) + c(2) * sin(c(3) * xdata);

% Definiere willk rliche Startparameter f r Fitfunktion.
% gute Sch tzung = bessere Konvergenz
  x0 = [0.9 2.2 6.0]; % wurden so gew hlt, dass x0 ungef hr gleich [a b c]
  
  % Fitbefehl, sucht passende Parameter x(i)
  [fitparameter,resnorm,~,exitflag,output] = lsqcurvefit(F, x0, x_data, y_data);

% optimale Parameter sind im Vektor "fitparameter" gespeichert.
output % gib Informationen zum Fitting aus
fitparameter % gib finale Fitparameter aus

% Plotte Ergebnis

% Fitfunktion konfigurieren
n_x = 200;   % Anzahl x-Werte der Fitfunktion
x_lo = 0;    % x-Skala Start
x_hi = 1;    % x-Skala Ende

x_scl = linspace(x_lo, x_hi, n_x);

% Ausgabe
plot(x_data, y_data, 'o') % Daten
hold on
plot(x_scl, F(fitparameter, x_scl)) % Fitfunktion
hold off
