Gnuplot < Physik < Naturwiss. < Vorhilfe
|
Ich habe folgendes Problem:
Gegeben:
dat-Datei die genau eine Spalte enthält mit 260 Einträgen.
Die Werte gehen von 1,024 bis 1,3485.
Jetzt möchte ich ein Histogram erstellen.
Das klappt auch so weit.
für die Binanzahl nehme ich 16 Bins, also ungefährt der Wert der Wurzel aus der Anzahl der Messwerte.
Dann lege ich folgendes fest:
n = 16.0 # anzahl bins
max = 1.348 # maximaler wert
min = 1.024 # minimaler wert
rows = 260.0 # anzahl messwerte
gaus(x)= a / (sigma*sqrt(2.*pi))*exp(-0.5*((x-mu)/sigma)**2.)
width = (max - min) / n
hist(x, width) = width * floor(x / width) + width / 2.0
mein Plotbefehl:
plot "test.txt" u (hist($1, width)):(100. / rows) smooth freq w boxes
Hist sollte mir die erste und einzige Spalte an Werten in die Bins mit der Breite width reinpacken für die x-Achse und für die y-Achse die relative häufigkeit.
Wie kann ich jetzt mit Gauß mein Histogram fiten?
fit gaus(x) "test.txt" via a,sigma,mu spuckt mir nur mist aus.
fit gaus(x) "test.txt" u (hist($1, width)):(100. / rows) via a,sigma,mu genauso der zweite Befehl.
Ich meine es ist kein Problem nen Gauß in Werte zu legen, die bereits als Histogrammwerte vorliegen, aber wie soll das hier klappen?
Der Fit sieht jedes mal so aus, als würde Gnuplot versuchen in die Urdaten zu fiten, sprich kein Histogramm.
Habe selbst die Parameter a,sigma,mu als Startwert festgelegt, was mir genau die richtige Kurve gibt.
Kann man hier die Datei anhängen?
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:18 Mo 11.05.2015 | Autor: | chrisno |
Du kannst eine Datei anhängen, dazu gibt es unterhalb des Eingabefensters einen blauen Text "Datei-Anhang". Klicke drauf und füge den Text[url=attach:1058219:1] Datei-Anhang[/url](ohne das attach und die Zahl, die wird dann erzeugt), der dann im Hilfsfenster erscheint, deiner Eingabe zu.
Gibt es in http://www.gnuplotting.org/calculating-histograms/ die Antwort auf Deine Frage?
|
|
|
|
|
Hallo!
Gnuplot kann ja selber keine Histogramme berechnen, daher dieser Trick.
Ganz wesentlich daran ist aber das
plot "test.txt" u (hist($1, width)):(100. / rows) smooth freq w boxes
Die Funktion hist() sorgt dafür, daß alle Wertepaare, die in einem bin liegen, den gleichen x-Wert bekommen. Und das smooth freq zählt, wie oft jeder x-Wert vorkommt, und das ist dann die gewünschte Höhe des Bins. (mit ein wenig Umrechnung)
Das bedeutet aber auch, daß der fit-Befehl auch ein smooth freq enthalten müßte, um dieses Zählen zu berücksichtigen.
Ohne es jetzt zu überprüfen meine ich aber, daß der fit-Befehl das aber nicht kann. Probier es einfach aus (zwischen using und via)
Nebenbei, deine Gaußfunktion ist nicht ganz ideal. Benutz besser
[mm] g(x)=\frac{A}{\sqrt{2\pi\sigma^2}}*\exp\left(-\frac{1}{2}*\left(\frac{x-x_c}{\sigma}\right)^2\right)
[/mm]
Nur so ist das A tatsächlich die Fläche unter dem Gauß, welche man ja häufig haben möchte. Das [mm] \sigma [/mm] unter der Wurzel sorgt dafür, daß A immer positiv bleibt. [mm] \sigma [/mm] selbst kann jedoch negativ werden, das macht der Formel ja nix.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 21:45 Mo 11.05.2015 | Autor: | MathTrivial |
Super, das mit dem smooth freq war mir nicht so bewusst.
Das trägt schonmal zum Verständnis bei.
Leider kann Gnuplot wohl wirklich nicht vor dem fiten noch die Häufigkeit zählen.
Dann ist Gnuplot ja wirklich mist.
Gibt es da denn keine andere Methode das im Gnuplot umzusetzen?
Oder kennst du eventuell ein anderes Programm, was nicht allzu schwer ist um ein Histogramm zu fiten?
ROOT ist mir ein Begriff, aber da muss man ja fast programmieren können, um sowas umzusetzen.
Schöne Grüße
Daniel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:15 Mo 11.05.2015 | Autor: | chrisno |
Auf der Seite, zu der ich den Link angegeben habe, wird gezeigt, wie Du die Werte der Histogramms in eine Datei schreibst und anschließend den Gauss an diesen Datensatz anpasst.
|
|
|
|
|
Super danke, werd mich damit mal auseinandersetzen, ist wohl die beste Idee.
|
|
|
|
|
Naja, Gnuplot ist in erster Linie zum Darstellen von Daten und Funktionen da, und erlaubt auch gewisse Berechnungen, hauptsächlich innerhalb einer Zeile der Daten.
Für eine richtige Datenanalyse ist es nicht gedacht, daher funktionieren Histogramme auch nur über Umwege.
Bevor du dich mit ROOT anlegst, solltest du dich nach anderen Möglichkeiten umsehen, denn ROOT kann schon recht komplex und vor allem fies werden. Zugegeben, es ist darauf zugeschnitten, mit Histogrammen zu arbeiten, und das kann es meist auch recht gut. Allerdings gibt es vor, C++ zu sein, hat aber mit der Idee dahinter oft nur wenig gemeinsam.
Schau dir mal Chrisnos Link an, da wird gezeigt. wie man die Daten mit gnuplot statt auf dem Bildschirm auszugeben, in eine Datei schreibt - danach kann man diese Datei ganz normal weiter verarbeiten.
|
|
|
|
|
load 'hist.fct'
plot 'histogram.txt' i 0 @hist ls [mm] 1,\
[/mm]
'' i 1 @hist ls 2
also habe mir eine fct-Datei mit gedit erstellt die genau den vorgeschrieben Inhalt hat
hist = 'u (binwidth*(floor(($1-binstart)/binwidth)+0.5)+binstart):(1.0) smooth freq w boxes' "
Ich sage Gnuplot wo mein Verzeichnis der Testdatei ist.
Der load-Befehl funktioniert, zumindest keine Fehlermeldung.
Allerdings sagt er mir jedes mal beim plot-befehl:
invalid character @
Leider sehe ich auf der Seite auch keine konkrete Erklärung, was i 0 @hist ls 1 für eine Syntax sein soll.
Was mache ich denn falsch, ich versteh es nicht.
|
|
|
|
|
Hallo!
Das @hist scheint so ne Art Ersetzung zu sein, nach dem Motto "Ersetze dies durch eine Definition, die ich wo anders gegeben habe". Ich hab das noch nie benutzt.
Hier mal ein Minimalbeispiel:
set table "newData.csv"
set polar
plot sin(t)*cos(t)
unset table
reset
plot "newData.csv" with lines
Im oberen Teil wird auf Polarkoordinaten geschaltet, um ein Kleeblatt zu plotten. Allerdings landet das ganze als Tabelle in einer neuen Datei "newData.csv". Mit dem reset werden alle Einstellungen wieder auf Standard gestellt, und anschließend werden die Daten aus der Datei geplottet, in ein ganz normales kartesisches Koordinatensystem.
Wenn du im oberen Teil nun deinen Code einfügst, der das Histogramm erzeugt, bekommst du eine Datei, in der das Histogramm direkt drin steht. Und dann kannst du das auch fitten.
|
|
|
|
|
Ich danke dir recht herzlich für deine Mühen,
wenn ich dich kennen würde, würd ich dir nen Bier ausgeben =)
Habs jetzt durch nen bisschen rumprobieren mit der Funktion "set table"
wunderbar hinbekommen.
Schöne Grüße
Daniel
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:56 Di 12.05.2015 | Autor: | chrisno |
Für die kombinierte Datenauswertung und Präsentation ist R ein vielgelobtes Werkzeug.
|
|
|
|