Erstellen Sie neue Daten in einer Tabelle und passen Sie sie an

1368
Mattes

Ich möchte folgendes tun:

Ich habe einen Datensatz, der einer Gaußschen Linienform folgt, aber es gibt einige Daten, die stark abweichen. Für die resultierende Passung sollten diese Datenpunkte nicht enthalten sein.

Meine Idee ist also, zwei Gaussianer oben und eine unten als Einschränkung zu erstellen. Damit werden eben alle Datenpunkte, die zwischen diesen 2 Gaußschen liegen, im Fit und der Rest draußen nicht berücksichtigt.

Erstellen Sie neue Daten in einer Tabelle und passen Sie sie an

Ich kann problemlos 2 Gaussians erstellen und diese Daten in einer Tabelle erstellen, indem Sie Folgendes verwenden: (Hinweis: data = Datendatei)

set table '1.Gauss'  plot g(x)+0.1  unset table  set table '2.Gauss'  plot g(x)-0.1  unset table  set table 'all'  plot '1.Gauss', '2.Gauss', 'data'  unset table  

Aber dann: Alle Daten werden nacheinander aufgelistet. Außerdem weiß ich nicht, wie ich später passen soll, indem ich sage, verwenden Sie diese Daten, wenn sie zwischen diesen beiden Gaußern liegen.

Hast du noch eine andere Idee?

ZUSATZ:

Ich bin nicht wirklich in der Programmierung oder im Gnuplot, also habe ich Schwierigkeiten, Ihre Botschaften zu verstehen. Also hier ist meine gesamte Programmierung in gnuplot:

 set xrange [1038.6603:1038.666] set yrange [0.8:1.3] file="data"  g(x) = N0*(A*exp(-(x-(b+d))2/(2*sigma2)))+c  N0=0.2; b=1038.66315;d=0.00001; c=1; A=3; sigma=0.0001  filterData(y,m,M)=((yM)? 1/0 : y)  fit h(x) file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via N0,d,c,A,sigma  plot file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) g(x)-0.1, g(x)+1, h(x) 

In der vorletzten Zeile sagt gnuplot: "undefined variable: x"

Ich weiß, dass etwas fehlt oder falsch ist, aber ich weiß nicht, wie ich es lösen soll. Könnte vielleicht auch deine Zeilen kommentieren? Damit ein Laie es verstehen kann? Vielen Dank :)

HIER 2. ZUSATZ:

hier ist mein ganzer text:

 set xrange [1038.6598:1038.6663] set yrange [0.8:1.3] set fit errorvariables file= "09_05_16-10.thzpp"  g(x) = N0*(A*exp(-(x-(b+d))**2/(2*sigma**2)))+c N0=0.2; b=1038.66315;d=0.00001; c=1; A=3; sigma=0.0001 filterData(y,m,M)=((y<m||x>M)? 1/0 : y) fit h(x) file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via N0,d,c,A,sigma  plot file using 1:(filterData($2,g($1)-0.1,g($1)+0.1)), g(x)-0.1, g(x)+1, h(x) 

Das gibt mir den Fehler "in Zeile 8: undefined variable: x"

Meine Daten liegen also im x-Bereich zwischen: [1038.6598: 1038.6663]. Wenn ich die letzten 3 Zeilen lösche und stattdessen verwende:

 fit [1038.6603:1038.666] [0.95:1.2] g(x) file via N0,d,c,A,sigma plot file title 'Messung', g(x) title 'Fit' 

es funktioniert, aber ich habe nicht diese schöne 2 Gaußsche Einschränkung.

Was ist also in meinem oberen Text falsch?

1
Es gibt mindestens einen Tippfehler in Ihrer Formel für "g", die "2" nach einer Klammer. Bitte fügen Sie genau Ihren Code ein. Ihr x-Bereich macht auch nicht viel Sinn. Wenn Ihre Daten wirklich zwischen x = 1038.6603 und x = 1038.666 liegen und durch Fließkommaberechnung mit Double-Precision-Arithmetik ermittelt wurden, befürchte ich, dass der relative Fehler auf x sehr groß sein wird. Und dies kann auch ein Problem für die Passform sein. Sie sollten den Ursprung dieser Frequenzdaten aus zurücksetzen. Joce vor 7 Jahren 0
Hier gibt es eher 'undefined function h (x)'. Sie müssen es definieren. Der Grund, warum ich es in meiner Antwort unten eingeführt habe, ist, dass Sie g (x) nicht anpassen können, indem Sie während der Verwendung gleichzeitig filtern ... Joce vor 7 Jahren 0
Ja, ich habe es getan, aber es hilft nicht. Kann mir bitte jemand helfen? Mattes vor 7 Jahren 0
Ich habe gerade bemerkt, dass es ein `x` in` filterData (y, m, M) = ((yM) 1/0: y) `was ein" y "sein sollte,` filterData (y, m, M) = ((yM) 1/0: y) '. Joce vor 7 Jahren 0
Ich habe diesen Fehler gestern gefunden :) jetzt funktioniert es: D !!! grosses Dankeschön! ABER ... Folgendes ist wirklich ernst: Wenn ich den Fit mit 2 Gaussians verwende, ist mein Fehler größer als ohne den Gaußians. Es sollte aber umgekehrt sein. Weißt du, warum? Mattes vor 7 Jahren 0
Das Filtern der Daten vor dem Anpassen ist meines Erachtens nicht angebracht. Wie werden die Parameter von "g" ausgewählt? Jedenfalls ist dies keine Frage für Superuser. (Übrigens, denken Sie darüber nach, nützliche Antworten zu geben) Joce vor 7 Jahren 0
@Joce ... es ist ein nicht registrierter Benutzer ... Ich habe Zweifel, dass Mattes bald zurück sein wird. Nehmen Sie stattdessen meine Stimme (n). Hastur vor 7 Jahren 0

2 Antworten auf die Frage

1
Yorik

Sie können Daten filtern, indem Sie eine Funktion wie die folgende erstellen:

min_value = 1 max_value = 2 filterData(x)=(x < min_value || x > max_value) ? (1/0) : (x) plot 'data' u 1:(filterData($2)) 

Der ternäre Operator: (is this true) ? it is true : it is falseund 1/0ist undefiniert, was gnuplot unbemerkt ignorieren wird.

(nicht getestet)

1
Joce

Ich verstehe nicht, warum Sie die Gaussians in Dateien speichern müssen. Sie können direkt mit Ihrer Gauß-Funktion arbeiten g.

Wenn Sie Ihre Daten mit den beiden Gaussianen vergleichen möchten, müssen Sie für die Filterfunktion an der betrachteten Position den Wert max und min angeben:

filterData(y,m,M)=((y<m||y>M)? 1/0 : y) 

Dann können Sie plotten und / oder passen:

fit h(x) 'data' using 1:(filterData($2,g($1)-0.1,g($1)+0.1)) via ... plot 'data' using 1:(filterData($2,g($1)-0.1,g($1)+0.1)), \ g(x)-0.1, \ g(x)+0.1, \ h(x)