Standardabweichung, Varianz <=Rundungsfehler
-
Hi zusammen
Ich soll so einige Funktionen für eine Messwertanalyse machen. Da hab ich mir gedacht, sowas hat doch mit Sicherheit schon mal jemand gemacht. Wenn einer also zu folgenden Themen schon mal ne Funktion geschrieben hat wäre ich sehr sehr Dankbar wenn er diese posten könnte. Oder vielleicht hat mir jemand nen guten Link. (nicht was es ist, das weiß ich schon)
Bitte nicht falsch verstehen ich will nicht dass ihr für mich proggt, ich will nur das Rad nicht neu erfinden.zentrale Momente:
-(1) Standardabweichung
-(2) Varianz
-(3) Schiefe
-(4) Kurtosis = WölbungVielen lieben Dank
-
Wie löst man das denn in Mathe? Also auf dem Papier?
Solche Formeln kann man normalerweise sehr schön übernehmen.
-
schau hier mal zentrales Moment bzw ganz unte besondere Momente
Diese FKTen sollten glaube ich rekursiv lösbar sein, dass ich also quasi beim Aufruf der FKT angebe welches zentrale Moment, und dem entsprechen läuft er durch.Ich versuch mich hier mal:
Standardabweichung = s
Varianz = s2s= Wurzel(((Σ(xi-x‾)2)/n))
s2 = ((Σ(xi-x‾)2)/nWobei n die Anzahl der Werte ist (hab ich ne Funktion die mir das gibt)
erst mal soweit
-
So ich hab mal die StdAbweichung gemacht!
Könnte das stimmen??unsigned long n = getAnzahlSamples(Wavefile); long double SummeX = SummeSamples(Wavefile,0,n); long double SummeXquadrat = SummeSamplesQuadrat(Wavefile,0,n); double STDABW = sqrt((n*SummeXquadrat-(SummeX*SummeX))/(n*(n-1))); return STDABW;
-
das ist ja gar nicht so schwer wie ich dachte aber, wenn ich mit Excel die Angaben ausrechne bekomm ich ganz schöne ungenauigkeiten, die sich durch quadrieren halt ganz schön aufsummieren!!
z.B. Hab ich für die Varianzin Excel 877823607,1
und in meinem Prog 877818418.34157133
Wo kommt die ungenauigkeit her?
Hier mal meine FKTen:double CWavealyzeDoc::Standardabweichung(fstream Wavefile) { unsigned long n = getAnzahlSamples(Wavefile); long double SummeX = SummeSamples(Wavefile,0,n); long double SummeXquadrat = SummeSamplesQuadrat(Wavefile,0,n); double StdAbw = sqrt((n*SummeXquadrat-(SummeX*SummeX))/(n*(n-1))); return StdAbw; } double CWavealyzeDoc::Varianz(fstream Wavefile) { unsigned long n = getAnzahlSamples(Wavefile); long double SummeX = SummeSamples(Wavefile,0,n); long double SummeXquadrat = SummeSamplesQuadrat(Wavefile,0,n); double Varianz = (n*SummeXquadrat-(SummeX*SummeX))/(n*(n-1)); return Varianz; } long double CWavealyzeDoc::SummeSamples(fstream Wavefile, unsigned long StartSample, unsigned long EndSample) { unsigned long * pData=0; long double Summe = 0; if(Samples_to_intArray(Wavefile, pData,StartSample,EndSample,"links")) { for (unsigned long i = 0; i<=getAnzahlSamples(Wavefile);i++) { Summe += pData[i]; } } return Summe; } long double CWavealyzeDoc::SummeSamplesQuadrat(fstream Wavefile, unsigned long StartSample, unsigned long EndSample) { unsigned long* pData=0; long double Summe = 0; if(Samples_to_intArray(Wavefile, pData,StartSample,EndSample,"links")) { for (unsigned long i = 0; i<=getAnzahlSamples(Wavefile);i++) { Summe += pData[i]*pData[i]; } } return Summe; }
-
Kann mir keiner sagen ob ich ungenau bin oder ob das ungenaue von Excel kommt. Ich würde es ja gern mal von Hand nachrechnen, aber die große ungenauigkeit tritt halt erst auf wenn ich mal ne gute Anzahl Werte hab die ich aufsummieren muss. Und in genanntem Besipiel wären das knapp ü+ber 34000
Wo passiert diese ungenauigkeit??
-
Was anderes als selber nachrechnen wüßte ich jetzt nicht.
Ich habe schon nach dem beliebtesten Ungenauigkeitsfehler geguckt, habe ihn aber nirgends gefunden:
Man muss immer erst große Zahlen erzeugen bevor man sie dividiert. Sonst gibt das schnell fette Rundungsfehler.Ich bin leider in Mathe nicht so fit.
Vielleicht solltest du den Threadtitel mal so ändern, dass Leute reingucken, die sich mit Rundungsfehlern auskennen.
Und ein Matheforum gibt es hier für alle Fälle auch noch.
-
Sag uns erstmal was das mit MFC/Visual C++ zu tun hat.
-
lol? schrieb:
Sag uns erstmal was das mit MFC/Visual C++ zu tun hat.
Stimmt irgendwie...
Polofreak: Wenn du in ein anderes Forum geschoben werden möchtest, dann sag es.
So auf Anhieb weiß ich aber leider nicht, wo hier die Matheasse sitzen.
-
lol? schrieb:
Sag uns erstmal was das mit MFC/Visual C++ zu tun hat.
Naja angefangen hat es ja mit: "Ich hab keine Ahnung wie das geht, vielleicht gibt es ja in der MFC fertige bzw nutzbare Funktionen."
Drum hier im MFC Forum.Aber mittlerweile ist es wirklich eher das Rundungsproblem. Drum wäre es mittlerweile besser im Mathe-Forum aufgehoben. Estartu, wärst du so lieb und blinzelst mich rüber? So per Astral-Projektion?
-
Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum Mathematik verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Klaro.
Viel Erfolg hier.
-
Danke schön ich hoffe hier kann mir einer helfen.
Es wird sich raus stellen.
-
wenn du maple oder octave zur hand hast: rechne doch dort mal nach. ansonsten der gute alte taschenrechner kanns auch auf das ergenis von excel würd ich nicht so viel geben...
-
Ich würde eher Excel vertrauen als einem Ergebnis, das beim Rechnen mit Fließkommavariablen entstanden ist. Wie groß sind denn die Werte, die dabei als Zwischenergebnis rauskommen? Würde ein 64Bit-Integer ausreichen?
-
klar kann es der gute alte TR doch hab ich ehrlich gesagt nicht die lust 34782 Werte in den TR zu tippen! Maple oder ähnliches hab ich leider nicht da. Ist jemand hier dem ich mal die Werte schicken darf?
-
Wobei: wenn man wirklich viele Meßwerte hat, dann bekommt man oft ziemliche numerische Ungenauigkeiten. Aber 35000 ist jetzt nicht soo viel.
double Varianz = (n*SummeXquadrat-(SummeX*SummeX))/(n*(n-1));
Stimmt das denn überhaupt?
Es gilt der Verschiebungssatz: Var(X)=E(X2)-E(X)2 mit E=Σ x_i W(x_i). Offenbar ist bei dir W(x_i) = 1/n (wobei n gleich Anzahl der Meßwerte), also
Var(X) = 1/n (Σ x_i^2) - 1/n^2 (Σ x_i)^2 = 1/n (SummeXquadrat - 1/n SummeX*SummeX)
Kann aber sein, daß ich jetzt danebenliege. Wie hast Du deinen Ausdruck hergeleitet?
-
Hallo Polofreak,
z.B. Hab ich für die Varianz
in Excel 877823607,1
und in meinem Prog 877818418.34157133
Wo kommt die ungenauigkeit her?Woher willst Du wissen, dass Excel recht hat? Vielleicht ist das ja ungenau.
Sicherheitshalber solltes Du alle double als long machen, auch die Rückgabewerte der ersten beiden Funktionen. Es könnte sein, daß alle Variablen Deiner Formel erstmal auf double verkleinert werden, bevor sie in die Formel eingerechnet werden. Also rechne erstmal Deine Varianz mit long double aus.Dann sehn wir mal weiter.
mfG
rudiS
-
hergeleitet hab ich den Ausdruck eigentlich mehr oder weniger gar nicht ich hab einfach in der Excel-Hilfe (F1) nach Varianz gesucht und dann die Formel die dort steht versucht nachzubilden (also doch hergeleitet). Ich pack mal alles in long doubles, wobie ich mir nicht vorstellen kann, dass es das ist, da ich 1. dann ganz andere Ungenauigkeiten rein bekommen würde, 2. jedes mal was anderes raus bekommen würde wenn ich wirklich nen Buffer overflow hätte und 3. selbst double ausreichen sollte. Aber ich werde es dennoch probieren.
-
OK auch mit long double tut sich nichts in der Genauigkeit. Kann mir einer von euch mal ne (allgemeine) Formel für das zentrale moment nennen? Es gibt scheinbar zig verschiedene, ich brauch eine Formel die möglichst wenig Rechenaufwand benötigt, denn wie gesagt hab ich einige Werte und zum anderen muss ich das alles in der Taktzeit eines Testers schaffen.
Vielen Dank schon mal für die Hilfe