|
|
Hallo Uli, was genau mit den Gewichten passiert ist in Mathematica bei Dir, kann man mangels Beispiel nicht nachvollziehen. Nur zum Sagen, auf eine Idee wie die folgende wirst Du als Physiker sicher nicht gekommen sein: In[1]:= <<Statistics`NonlinearFit` In[2]:= <<Statistics`ContinuousDistributions` In[8]:= With[{? = 0., ? = 0.75, ? = 0.25}, pic = Plot[1/(x^2 + (?/2)^2) + Random[NormalDistribution[?, ?]], {x, -2, 2}, PlotDivision -> 30, DisplayFunction -> Identity]; data = pic[[1,1,1,1]]; Print["There are ", Length[data], " datapoints."]; NonlinearRegress[data, 1/(x1^2 + (?1/2)^2) + Exp[-((x1 - ?1)^2/(2*?1^2))]/ (Sqrt[2*Pi]*?1), {x1}, {?1, ?1, ?1}, RegressionReport -> BestFitParameters]] "There are "860" datapoints." Out[8]= {BestFitParameters -> {?1 -> 0.0037703537868760337, ?1 -> 0.07695177010624978, ?1 -> 0.26111019517895107}} Dieser Ansatz für die Fitfunktion ist falsch, weil (1) NormalDistribution[my, sigma] positive und negative Werte abgibt, aber die Normalverteilung im Ansatz bekanntermassen nicht; (2) die funktionalen Abhängigkeiten verkehrt sind, das Rauschen ist unabhänhig von x1. Mit dem Ansatz erzeugt man nur systematische Fehler. Man kann testen, inwiefern die Lorentzdaten von einer Normalverteilung verrauscht wurden, das ist ein Test von 2 Hypothesen; Fitter testen immer Hypothesen in Form der Ansätze, in dem Fall habe ich keinen Weg gefunden, beide Hypthesen mit einem Aufruf von NonlinearRegression zu testen: In[161]:= Clear[data, ?1, ?2, gauss]; With[{? = 0., ? = 0.75, ? = 0.25, dy = 0.1}, pic = Plot[1/(x^2 + (?/2)^2) + Random[NormalDistribution[?, ?]], {x, -2, 2}, PlotDivision -> 30, DisplayFunction -> Identity]; data = pic[[1,1,1,1]]; Print["There are ", Length[data], " data points."]; ?2 = NonlinearRegress[data, 1/(x1^2 + (?1/2)^2), {x1}, {?1}, RegressionReport -> BestFitParameters][[1,2,1,2]]; Print["LorentzFit: ?2 = ", ?2]; dist = Sort[Last[Transpose[data]] - (1/(#1^2 + (?2/2)^2) & ) /@ First[Transpose[data]]]; val = First[dist] + dy/2.; oo = 0; gauss = {}; For[o = 1, o <= Length[dist], o++, If[dist[[o]] < val, oo++, AppendTo[gauss, {val - dy/2., oo}]; val += dy; oo = 0; --o]]; gauss = Transpose[{First[Transpose[gauss]], Last[Transpose[gauss]]/ (dy*Length[dist])}]; Print["Gaussian Fit:"]; NonlinearRegress[gauss, Exp[-((x1 - ?1)^2/(2*?1^2))]/(Sqrt[2*Pi]*?1), {x1}, {?1, ?1}, RegressionReport -> BestFitParameters] ] From In[161]:= "There are "860" data points." From In[161]:= "LorentzFit: ?2 = "0.25040192109887016 From In[161]:= "Gaussian Fit:" Out[163]= {BestFitParameters -> {?1 -> -0.0067614107281022936, ?1 -> 0.7576946340056632}} Also ganz gut getroffen diesmal. Andere Runs geben auch schon wesentlich schlechtere Ergebnisse. Die Ansicht ListPlot[gauss] ist instruktiv in solchen Fällen. Schönen Sonntag Udo. Uli Jentschura wrote: Lieber DEMUG-Mitglieder, |