% Importiere Datensatz und bestimme besten Fit bei
% gegebener Funktion

% definiere Eingaben für den Import-Befehl
	filename = 'Ged_Schwing.csv';
	delimiterIn = ',';              % welches Symbol trennt Spalten
	headerlinesIn = 1;              % überspringe erste x Zeilen

% importiere Tabelle in Matlab
	tab = importdata(filename,delimiterIn,headerlinesIn);

% generiere Vektoren für x- und y-Werte aus importierter Tabelle
	t = tab.data(:, 1);
	amp = tab.data(:, 2);
  del_t = tab.data(:, 3);
  del_amp = tab.data(:, 4);

% erzeuge Plot mit Fehlerbalken
  errorbar(t,amp,del_amp,del_amp,del_t,del_t,'.')
	hold on % schreibt nächsten Graphen in das gleiche Fenster

% Achsenbeschriftung
	xlabel('Zeit t');
	ylabel('Schwingungsamplitude');

% 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_data ist das eigentliche Argument der Funktion
  F = @(c,xdata) c(1) * exp(-c(3) * xdata) .* cos(2*pi*c(2) * xdata);

% Definiere willkürliche Startparameter für Fitfunktion.
% gute Schätzung = bessere Konvergenz
  x0 = [3 0.3/(2*pi) 0.004];
  
  % Fitbefehl, sucht passende Parameter x(i)
  [fitparameter,resnorm,~,exitflag,output] = lsqcurvefit(F, x0, t, amp);

% optimale Parameter sind im Vektor "fitparameter" gespeichert.

output % gib Informationen zum Fitting aus
fitparameter % gib finale Fitparameter aus

% plotte Fitkurve über Datensatz

% Fitfunktion konfigurieren
n_x = 200;      % Anzahl x-Werte der Fitfunktion
x_lo = t(1);    % x-Skala Start
x_hi = t(end);  % x-Skala Ende

x_scl = linspace(x_lo, x_hi, n_x);

% Ausgabe
plot(x_scl, F(fitparameter, x_scl)) % Fitfunktion
hold off
