Da das fitten einer Funktion Zeit beansprucht, in Abhängigkeit der Anzahl Parameter, die gefittet werden sollen, möchte man der Fitfunktion lsqcurvefit nur wirklich die zu fittenden Parameter in einem Vektor x übergeben. Gleichzeitig will man in der Wahl und in der Anzahl der zu fittenden Parameter frei bleiben, was dazu führt, dass der entsprechende Vektor x seine Länge ändert2), sowie auch die Bedeutung der Elemente des Vektors sich ändern.
Die Matlab®-Funktion lsqcurvefit findet im einfachsten Fall die Koeffizienten x, die das Ergebnis F der nichtlinearen Funktion F = fun(x,xdata) den (experimentellen) Daten ydata am besten entsprechen lässt.
fun = F(x,xdata) x = lsqcurvefit(fun,x0,xdata,ydata)
fun ist der Zuweisungsname der Funktion, die gefittet werden soll. Sie hat zwei Eingabewerte: einen Vektor oder eine Matrix3) x, und einen Vektor oder eine Matrix xdata. fun gibt den Vektor oder die Matrix F zurück. F enthält die Ergebnisse der Auswertung der Zielfunktion am Ort xdata mit den Koeffizienten x.
lsqcurvefit akzeptiert als Zielfunktion (fun) aber nur Funktionen, die von nur einer Variable, dem Koeffizienten x, abhängen.4) In unserem Fall ist die Zielfunktion trEPRTSim_fit,5) die zusätzlich zur Variable x6) noch weitere Parameter braucht. Um diese extra Parameter, deren Anzahl sich je nach Nutzerauswahl ändert7) und deren Werte frei wählbar sind, sich während des Fits aber nicht ändern, der Zielfunktion übergeben zu können, muss man sich einer anonymen Funktion bedienen.
Um dem Problem der sich ändernden Länge des Vektors x und der damit verbundenen neuen Bedeutung der Element im Vektor Herr/Frau zu werden, wurde unter anderem die Funktion trEPRTSim_parTransfer geschrieben.
Kleine Einführung in anonyme Funktionen bei Matlab inkl. Link auf die betreffende Online-Dokumentation bei Mathworks.
Eine anonyme Funktion ist eine Funktion, die nicht in einer eigenen Datei gespeichert wird. Sie ist einer Variable zugewiesen, deren Datentyp function_handle ist. Vergleichbar mit dem Inputargument einer Funktion können dem function_handle ebenfalls Werte übergeben werden.
brr = @(x) x.^2; v = [4 8 2]; a1 = brr(v) a1 = 16 64 4
Um mit Hilfe einer anonymen Funktion lsqcurvefit die extra Parameter mitzugeben wurde wie folgt vorgegangen: Erst wird die anonyme Funktion fitfun definiert.
fitfun = @(x,Bfield)trEPRTSim_fit(x,Bfield,Sys,Exp,spectrum,fitpar,tofit);
Alles was hinter x in den Übergabeparametern von trEPRTSim_fit ist, sind zusätzliche Parameter.
Danach wird von lsqcurvefit auf die anonyme Funktion zugegriffen.
fittedpar = lsqcurvefit(fitfun,inipar,Bfield,Signal,lb,ub,option);
trEPRTSim_simpar bzw. inipar und fittedparlsqcurvefit als zusätzliche Parameter, mit festen Werten, übergeben werden.