|
Eine Beschreibung Über das, was beim Fit vorgeht, findet man in Press et al, Numerical Recipes in C, 2nd ed., Cambridge, 1992 (ISBN0 521 43108 5) auf Seite 671ff. Dort ist auch die Verallgemeinerung mit Gewichten an den Meßwerten beschrieben. Hier ein kleines Beispiel als Mathematica-Code: (* Für den Fit seien Daten da={{x1,y1},....,{xn,yn}} gegeben. z.B.: *) f[x_]:=3.21+9.26x + 2.1*x^2+0.1*Random[]; da=Table[{x,f[x]},{x,1.,10}]; Clear[x]; funs={1,x,x^2}; (* Funktionen, auf die gefittet werden soll *) vars={x}; design=Table[funs/.{x->da[[i,1]]} (* die DESIGN-Matrix des Fit-Problems *) ,{i,Length[da]} ]; Print["Designmatrix: ",Dimensions[design]," Funktionen:",funs]; Print[TableForm[design,TableSpacing->{0,3}]]; psi=PseudoInverse[design]; Print["Pseudounverse: ",Dimensions[design]]; Print[TableForm[psi,TableSpacing->{0,1}]]; Print["Me_werte:",da]; Print["Fit mit psi berechnet : ",psi.Transpose[da][[2]]]; Print[" mit Mathematica-Funktion: ", Fit[da,funs,vars]]; Print[" das wurde gesucht : ",f[x]]; (* wie gut die Fit-Daten die einzelnen Koeffizienten bestimmt, hängt von der Kondition der Design-Matrix ab. *) tol=Automatic; sv=SingularValues[N[design],Tolerance->tol]; (* SingulatValues geht nicht mit exakten Zahlen! *) Print["Sval, dim W =",Length[sv[[2]]]," tol=",tol]; Print[" Diag:",sv[[2]]]; (* Auf erste/letzte Zahl kommt es an! *) Print[" Kond:",First[sv[[2]]]/Last[sv[[2]]]]; (* gut: kleine Zahl! *) Schade, daß Mathematica die Matrixkondition nicht als "Nebenergebnis" mit anzeigt, dann wüßte man direkt, was man von den Fitparametern halten kann, wenn man die Streuungen der Y-Werte kennt. Gute Kondition und kleine Mesawertstreuung wünscht Dipl-Math. Adalbert Hanaen <hsse@XXXXXXX.de> |