LEAST SQUARES FIT
Methode der kleinsten Quadrate
mit beliebigen Funktionen

Wie kann man eine "beliebige", in nichtlinearer Weise von Parametern
abhängige Funktion an Daten anpassen?

Nehmen wir dazu in einem Beispiel einen Datensatz:

data = ReadList["data2.dat", {Number,  Number}]

Wir können uns den Datensatz mit dem folgenden Befehl anzeigen lassen:

dataplot = ListPlot[data]

Eine Ahnung, welche Funktionen hinter den Daten steckt, kann man
bei einer halblogarithmischen Darstellung erkennen:
(Im Normalfall kennt man bereits die funktionale Abhängigkeit)

<< Graphics`Graphics`
datalogplot  =  LogListPlot[data]

Um die LogPlot-Befehle benutzen zu können, muss erst das
Graphics-Modul geladen werden.

In dieser halblogarithmischen Darstellung zeigen sich zwei "lineare" Bereiche.
Solche Daten lassen sich sehr gut mit einem Modell anpassen, mit
f( x )   =    a Exp[-b x] + c Exp[-d x],
wobei die Zahlwerte als y = f(x) interpretiert werden.
Das Ziel ist jetzt, für die Parameter a,b,c und d Werte zu finden,
sodass f(x) die Daten möglichst gut beschreibt.
Nehmen wir weiterhin an, dass wir bereits eine Annahme für den
ungefähren Wert dieser Parameter haben.
In den meisten Situationen ist dies auch der Fall:

soln = {a->1.61, b->0.0076, c->3, d->0.05} ;

Jetzt definieren wir eine Funktion y, die für gegebene Werte der vier
Parameter und einem Wert x den entsprechenden Wert von f(x) liefert:

Attributes[y] = {Listable} ;
y[x_, a_, b_, c_, d_] := a Exp[-b x] + c Exp[-d x]

Attributes[yy] = {Listable} ;
yy[x_] = y[x,a,b,c,d] /. soln

Als nächstes bereiten wir die Daten für diese neue Funktion vor:

xlist = Transpose[data][[1]] ;
ylist = Transpose[data][[2]] ;

Wir können uns anzeigen lassen, wie gut unsere erste Annahme der
Parameter zu den Daten passt. Zunächst zeigen wir dazu den Verlauf
der Funktion yy(x) für den Bereich der durch die x-Werte abgedeckt wird:

yyplot = LogPlot[yy[x], {x, Min[xlist], Max[xlist]}]

Um jetzt zu sehen, wie gut diese Kurve zu den Daten passt,
stellen wir die Daten zusammen mit der Kurve dar:

Show[datalogplot, yyplot]

Machen wir weiter mit der Analyse. Üblicherweise wird als Maß,
wie gut ein Modell zu den Daten passt, die mittlere quadratische
Abweichung der Messwerte zum Modell benutzt.
Als mittlere quatratische Abweichung können wir definieren:

rmserror[a_, b_, c_, d_] := Sqrt[ Apply[ Plus,
             (ylist - y[xlist, a, b, c, d])^2]]

rmserror[a,b,c,d] /. soln

Das echte Ziel ist es jetzt, für die Parameter a,b,c,d Werte zu finden,
für die diese mittlere quadratische Abweichung minimal wird:

result = FindMinimum [ rmserror [ a, b, c, d],
  {a, {1,2}}, {b, {0,.02}}, {c, {3,4}}, {d, {0,.1}}]

OK. Mathematica hat diese Werte gefunden. Wir müssen sie nur noch anwenden:

msoln = result[[2]]

finalcurve = y[x,a,b,c,d] /. msoln

Wir können jetzt zeigen, dass diese neuen Werte die Daten deutlich besser beschreiben:

newplot = LogPlot[finalcurve, {x, Min[xlist], Max[xlist]}]

Show[datalogplot, newplot]