Gnuplot
Daten mit gnuplot anpassen
Suche…
Einführung
Der Fit-Befehl kann eine benutzerdefinierte Funktion an eine Menge von Datenpunkten (x,y)
oder (x,y,z)
anpassen , wobei eine Implementierung des nichtlinearen Least -Squares-Algorithmus ( NLLS ) von Marquardt-Levenberg verwendet wird.
Jede im Funktionskörper vorkommende benutzerdefinierte Variable kann als Fit-Parameter dienen, der Rückgabetyp der Funktion muss jedoch reell sein.
Syntax
- fit [ xrange ] [ yrange ] Funktion " Datendatei " mit Modifikator über Parameterdatei
Parameter
Parameter | Detail |
---|---|
Anpassungsparameter a , b , c und alle Buchstaben, die zuvor nicht verwendet wurden | Verwenden Sie Buchstaben, um Parameter darzustellen, die für eine Funktion verwendet werden. Zum Beispiel: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
start.par | Verwenden Sie stattdessen nicht initialisierte Parameter (der Marquardt-Levenberg initialisiert automatisch für Sie a=b=c=...=1 ), können Sie diese in eine Datei start.par und sie im Abschnitt parameter_file aufrufen. Beispiel: fit f(x) 'data.dat' u 1:2 via 'start.par' . Ein Beispiel für die Datei start.par ist unten gezeigt |
Bemerkungen
Kurze Einführung
fit
wird verwendet, um einen Parametersatz zu finden, der Ihre Daten am besten an Ihre benutzerdefinierte Funktion anpasst. Die Anpassung wird anhand der Summe der quadrierten Differenzen oder 'Residuen' (SSR) zwischen den Eingabedatenpunkten und den Funktionswerten beurteilt, die an denselben Stellen bewertet werden. Diese Menge wird häufig als "chisquare" (dh der griechische Buchstabe chi in Potenz von 2) bezeichnet. Der Algorithmus versucht, SSR oder genauer WSSR zu minimieren, da die Residuen vor dem Quadrieren mit den Eingangsdatenfehlern (oder 1,0) "gewichtet" werden. ( Ibidem )
Die Datei fit.log
Nach jedem Iterationsschritt werden detaillierte Informationen zum Status der Anpassung sowohl auf dem Bildschirm als auch in einer sogenannten Protokolldatei fit.log
. Diese Datei wird niemals gelöscht, sondern immer angehängt, damit der Verlauf des Anpassen nicht verloren geht.
Daten mit Fehlern anpassen
Es können bis zu 12 unabhängige Variablen vorhanden sein, es gibt immer 1 abhängige Variable und es können beliebig viele Parameter angepasst werden. Optional können Fehlerschätzungen zur Gewichtung der Datenpunkte eingegeben werden. (T. Williams, C. Kelley - gnuplot 5.0, ein interaktives Plotprogramm )
Wenn Sie einen Datensatz haben und passen möchten, wenn der Befehl sehr einfach und natürlich ist:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
wo stattdessen f(x)
auch f(x, y)
. Falls Sie auch Datenfehler haben, fügen Sie einfach das {y | xy | z}errors
( { | }
stellen die möglichen Optionen dar) in der Modifier- Option (siehe Syntax) . Zum Beispiel
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
wo das {y | xy | z}errors
Option {y | xy | z}errors
erfordert eine Spalte von 1 ( y
), 2 ( xy
), 1 ( z
), die den Wert der Fehlerschätzung angibt.
Exponentielle Anpassung mit xyerrors
einer Datei
Datenfehlerschätzungen werden verwendet, um die relative Gewichtung jedes Datenpunkts zu berechnen, wenn die gewichtete Summe der quadrierten Residuen, WSSR oder Chi-Quadrat bestimmt wird. Sie können die Parameterschätzungen beeinflussen, da sie bestimmen, wie stark die Abweichung jedes Datenpunkts von der angepassten Funktion die endgültigen Werte beeinflusst. Einige der Anpassungsausgabeinformationen, einschließlich der Parameterfehlerschätzungen, sind aussagekräftiger, wenn genaue Datenfehlerschätzungen bereitgestellt wurden. ( Ibidem )
Wir nehmen einen Beispieldatensatz mit dem Namen measured.dat
, der aus 4 Spalten besteht: die x-Achsen-Koordinaten ( Temperature (K)
), die y-Achsen-Koordinaten ( Pressure (kPa)
), die x-Fehlerschätzungen ( T_err (K)
) und die y-Fehlerschätzungen ( P_err (kPa)
).
#### 'measured.dat' ####
### Dependence of boiling water from Temperature and Pressure
##Temperature (K) - Pressure (kPa) - T_err (K) - P_err (kPa)
368.5 73.332 0.66 1.5
364.2 62.668 0.66 1.0
359.2 52.004 0.66 0.8
354.5 44.006 0.66 0.7
348.7 34.675 0.66 1.2
343.7 28.010 0.66 1.6
338.7 22.678 0.66 1.2
334.2 17.346 0.66 1.5
329.0 14.680 0.66 1.6
324.0 10.681 0.66 1.2
319.1 8.015 0.66 0.8
314.6 6.682 0.66 1.0
308.7 5.349 0.66 1.5
Nun stellen Sie einfach den Prototyp der Funktion zusammen, die aus der Theorie unseren Daten entsprechen sollte. In diesem Fall:
Z = 0.001
f(x) = W * exp(x * Z)
Dabei haben wir den Parameter Z
initialisiert, da die Auswertung der Exponentialfunktion exp(x * Z)
ansonsten zu großen Werten führt, die zu (Fließkommazahl) Infinity und NaN im Marquardt-Levenberg-Anpassungsalgorithmus führen Variablen - schauen Sie hier , wenn Sie mehr über Marquardt-Levenberg erfahren möchten.
Es ist Zeit, die Daten anzupassen!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Das Ergebnis wird aussehen
After 360 iterations the fit converged.
final sum of squares of residuals : 10.4163
rel. change during last iteration : -5.83931e-07
degrees of freedom (FIT_NDF) : 11
rms of residuals (FIT_STDFIT) = sqrt(WSSR/ndf) : 0.973105
variance of residuals (reduced chisquare) = WSSR/ndf : 0.946933
p-value of the Chisq distribution (FIT_P) : 0.493377
Final set of parameters Asymptotic Standard Error
======================= ==========================
W = 1.13381e-05 +/- 4.249e-06 (37.47%)
Z = 0.0426853 +/- 0.001047 (2.453%)
correlation matrix of the fit parameters:
W Z
W 1.000
Z -0.999 1.000
Wobei jetzt W
und Z
mit den gewünschten Parametern gefüllt sind und Fehler auf diese geschätzt werden.
Der folgende Code erzeugt das folgende Diagramm.
set term pos col
set out 'PvsT.ps'
set grid
set key center
set xlabel 'T (K)'
set ylabel 'P (kPa)'
Z = 0.001
f(x) = W * exp(x * Z)
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
p [305:] 'measured.dat' u 1:2:3:4 ps 1.3 pt 2 t 'Data' w xyerrorbars,\
f(x) t 'Fit'
Plotten mit Passung von measured.dat
Wenn Sie den Befehl with xyerrorbars
werden with xyerrorbars
für x und y angezeigt. set grid
wird ein gestricheltes Raster auf die wichtigsten Tics setzen.
Falls Fehlerschätzungen nicht verfügbar oder unwichtig sind, ist es möglich, auch Daten ohne das {y | xy | z}errors
:
fit f(x) "measured.dat" u 1:2 via W, Z
In diesem Fall mussten auch die xyerrorbars
vermieden werden.
Beispiel für die Datei "start.par"
Wenn Sie Ihre Anpassungsparameter aus einer Datei laden, sollten Sie alle zu verwendenden Parameter darin angeben und sie bei Bedarf initialisieren.
## Start parameters for the fit of data.dat
m = -0.0005
q = -0.0005
d = 1.02
Tc = 45.0
g_d = 1.0
b = 0.01002
Fit: grundlegende lineare Interpolation eines Datensatzes
Die grundlegende Verwendung von Fit lässt sich am besten durch ein einfaches Beispiel erklären:
f(x) = a + b*x + c*x**2 fit [-234:320][0:200] f(x) ’measured.dat’ using 1:2 skip 4 via a,b,c plot ’measured.dat’ u 1:2, f(x)
Es können Bereiche angegeben werden, um die bei der Anpassung verwendeten Daten zu filtern. Datenpunkte außerhalb des Bereichs werden ignoriert. (T. Williams, C. Kelley - gnuplot 5.0, ein interaktives Plotprogramm )
Die lineare Interpolation (Anpassung an eine Linie) ist die einfachste Möglichkeit, einen Datensatz anzupassen. Angenommen, Sie haben eine Datendatei, in der das Wachstum Ihrer y-Menge linear ist, können Sie verwenden
[...] lineare Polynome, um neue Datenpunkte innerhalb eines diskreten Satzes bekannter Datenpunkte zu erstellen. (aus Wikipedia, Lineare Interpolation )
Beispiel mit einem Polynom ersten Grades
Wir werden mit dem folgenden Datensatz, house_price.dat
, house_price.dat
, der die Quadratmeter eines Hauses in einer bestimmten Stadt und seinen Preis in USD 1000 beinhaltet.
### 'house_price.dat'
## X-Axis: House price (in $1000) - Y-Axis: Square meters (m^2)
245 426.72
312 601.68
279 518.16
308 571.50
199 335.28
219 472.44
405 716.28
324 546.76
319 534.34
255 518.16
Passen Sie diese Parameter mit gnuplot an. Der Befehl selbst ist sehr einfach, wie Sie anhand der Syntax feststellen können, definieren Sie einfach Ihren passenden Prototyp und verwenden Sie dann den Befehl fit
, um das Ergebnis zu erhalten:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Es könnte aber auch interessant sein, die ermittelten Parameter in der Grafik selbst zu verwenden. Der nachstehende Code passt in die Datei house_price.dat
und house_price.dat
die Parameter m
und q
auf, um die beste Kurvenannäherung des Datensatzes zu erhalten. Sobald Sie über die Parameter verfügen, können Sie den y-value
, in diesem Fall den Hauspreis , aus einem beliebigen x-vaule
( Quadratmeter des Hauses) berechnen, der nur in der Formel verwendet wird
y = m * x + q
der entsprechende x-value
. Lassen Sie uns den Code kommentieren.
0. Einstellung des Begriffs
set term pos col
set out 'house_price_fit.ps'
1. Ordentliche Verwaltung zum Verschönern der Grafik
set title 'Linear Regression Example Scatterplot'
set ylabel 'House price (k$ = $1000)'
set xlabel 'Square meters (m^2)'
set style line 1 ps 1.5 pt 7 lc 'red'
set style line 2 lw 1.5 lc 'blue'
set grid
set key bottom center box height 1.4
set xrange [0:450]
set yrange [0:]
2. Die richtige Passform
Dafür müssen wir nur die Befehle eingeben:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Speichern von m
und q
Werten in einem String und Plotten
Hier verwenden wir die sprintf
Funktion, um das Etikett (in das object rectangle
sprintf
vorzubereiten, in dem das Ergebnis der Anpassung gedruckt werden soll. Zum Schluss zeichnen wir die gesamte Grafik.
mq_value = sprintf("Parameters values\nm = %f k$/m^2\nq = %f k$", m, q)
set object 1 rect from 90,725 to 200, 650 fc rgb "white"
set label 1 at 100,700 mq_value
p 'house_price.dat' ls 1 t 'House price', f(x) ls 2 t 'Linear regression'
set out
Die Ausgabe wird so aussehen.