Hallo Udo,
ich glaube, wir haben die Lösung. Man kann das Problem
herunterkochen auf das Fitten einer Konstanten, und
erhält den selben Effekt. Die Konstante wird immer zu
klein gefittet (s.u.). Kleine Datenpunkte haben eben ein
grösseres relatives Gewicht, wenn man die Gewichte
> auf der Basis der gemessenen Werte <
verteilt. Würde man sie auf der Basis der wahren Werte
berechnen, wäre alles in Butter, diese kennt man aber
nicht, sonst bräuchte man gar nicht zu fitten. Unsere
Vermutung vom 02.08. trifft also zu und im Falle der
Lorentzfits äussert sich dies in einer kleineren Amplitude
und geringeren Breite, weil die Punkte, die weit von der
Linienmitte entfernt sind, die Linie sozusagen einschnüren.
Die Lösung ist ein ungewichteter Fit, denn da wird kein
Punkt aufgrund seiner Lage (wahr oder real) ausgezeichnet.
Entfernt man im Code unten die Gewichtung, erhält man
Fitergebnisse, die symmetrisch ("richtig") um den Startwert
verteilt sind und dies amplitudenunabgängig.
Viele Grüße,
Martin
--------------
<< Statistics`ContinuousDistributions`;
<< Statistics`NonlinearFit`;
sigma[n_] := Sqrt[n] + 0.025 n;
Fitdiffs = {};
amp = 50;
For[k = 1, k <= 100, k++,
{
thedata =
Table[amp + Random[NormalDistribution[0, sigma[amp]]], {i, 1, 50}];
theweights = Table[1/sigma[thedata[[i]]]^2, {i, 1, 50}];
constfit = NonlinearRegress[thedata, c, x, c, Weights -> theweights,
RegressionReport -> BestFitParameters];
AppendTo[Fitdiffs, amp - c /. (BestFitParameters /. constfit)];
}
];
ListPlot[Fitdiffs];
(* fast alle positiv *)
FitDifferences = {};
For[amp = 50, amp <= 1000, amp *= Exp[Log[1000/50]/10],
{
Fitdiffs = {};
For[k = 1, k <= 100, k++,
{
thedata = Table[amp + Random[NormalDistribution[0, sigma[amp]]],
{i, 1, 50}];
theweights = Table[1/sigma[thedata[[i]]]^2, {i, 1, 50}];
constfit = NonlinearRegress[thedata, c, x, c, Weights ->
theweights, RegressionReport -> BestFitParameters];
AppendTo[Fitdiffs, amp - c /. (BestFitParameters /. constfit)];
(* Abweichung des einzelnen Punkts *)
}
];
afit = NonlinearRegress[Fitdiffs, a, x, a,
RegressionReport -> BestFitParameters];
AppendTo[FitDifferences, (a /. (BestFitParameters /. afit))/amp];
(* relativer Fehler des Fits *)
}
];
ListPlot[FitDifferences, Frame -> True, Axes -> False];
(* immer positiv, relativer Fehler wird kleiner bei wachsender Amplitude *)
--------------