Gnuplot
Adatta i dati con gnuplot
Ricerca…
introduzione
Il comando di adattamento può adattare una funzione definita dall'utente a un insieme di punti dati (x,y)
o (x,y,z)
, utilizzando un'implementazione dell'algoritmo Marquardt-Levenberg dei minimi quadrati non lineari ( NLLS ).
Qualsiasi variabile definita dall'utente che si verifica nel corpo della funzione può servire come parametro di adattamento, ma il tipo restituito della funzione deve essere reale.
Sintassi
- fit [ xrange ] [ yrange ] function " datafile " usando il modificatore tramite parameter_file
Parametri
parametri | Dettaglio |
---|---|
Adattamento dei parametri a , b , c e di qualsiasi lettera che non era stata precedentemente utilizzata | Utilizzare le lettere per rappresentare i parametri che verranno utilizzati per adattare una funzione. Es: f(x) = a * exp(b * x) + c , g(x,y) = a*x**2 + b*y**2 + c*x*y |
Parametri file start.par | Invece usando i parametri non inizializzati (il Marquardt-Levenberg si inizializzerà automaticamente per te a=b=c=...=1 ) puoi metterli in un file start.par e chiamarli con nella sezione parameter_file . Ad esempio: fit f(x) 'data.dat' u 1:2 via 'start.par' . Di seguito è riportato un esempio per il file start.par |
Osservazioni
Breve introduzione
fit
è usato per trovare una serie di parametri che "meglio" si adatta ai tuoi dati alla tua funzione definita dall'utente. L'adattamento viene giudicato sulla base della somma delle differenze al quadrato o dei "residui" (SSR) tra i punti dei dati di input e i valori delle funzioni, valutati nelle stesse posizioni. Questa quantità viene spesso chiamata "chisquare" (cioè la lettera greca chi, alla potenza di 2). L'algoritmo tenta di ridurre al minimo SSR, o più precisamente, WSSR, poiché i residui vengono "pesati" dagli errori dei dati di input (o 1.0) prima di essere quadrati. ( Ibidem )
Il file fit.log
Dopo ogni passaggio di iterazione vengono fornite informazioni dettagliate sullo stato fit.log
sia sullo schermo che su un file di registro cosiddetto fit.log
. Questo file non verrà mai cancellato ma verrà sempre aggiunto in modo che la cronologia del fit non vada persa.
Adattamento dei dati con errori
Possono esserci fino a 12 variabili indipendenti, c'è sempre 1 variabile dipendente e qualsiasi numero di parametri può essere montato. Facoltativamente, è possibile immettere stime di errore per la ponderazione dei punti dati. (T. Williams, C. Kelley - gnuplot 5.0, Un programma di plottaggio interattivo )
Se si dispone di un set di dati e si desidera adattarlo se il comando è molto semplice e naturale:
fit f(x) "data_set.dat" using 1:2 via par1, par2, par3
dove invece f(x)
potrebbe essere anche f(x, y)
. Nel caso in cui si abbiano anche stime di errori di dati, basta aggiungere {y | xy | z}errors
( { | }
rappresentano le possibili scelte) nell'opzione modificatore (vedi sintassi) . Per esempio
fit f(x) "data_set.dat" using 1:2:3 yerrors via par1, par2, par3
dove il {y | xy | z}errors
opzione di {y | xy | z}errors
richiede rispettivamente 1 ( y
), 2 ( xy
), 1 ( z
) colonna che specifica il valore della stima dell'errore.
xyerrors
esponenziale con xyerrors
di un file
Le stime degli errori dei dati vengono utilizzate per calcolare il peso relativo di ciascun punto dati quando si determina la somma ponderata dei residui quadratici, WSSR o chisquare. Possono influenzare le stime dei parametri, poiché determinano l'influenza che la deviazione di ciascun punto di dati dalla funzione adattata ha sui valori finali. Alcune delle informazioni di output di adattamento, incluse le stime degli errori dei parametri, sono più significative se sono state fornite stime accurate degli errori dei dati. ( Ibidem )
Prendiamo un campione di dati measured.dat
, composto da 4 colonne: le coordinate dell'asse x ( Temperature (K)
), le coordinate dell'asse y ( Pressure (kPa)
), le stime dell'errore x ( T_err (K)
) e le stime dell'errore y ( 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
Adesso componi il prototipo della funzione che dalla teoria dovrebbe approssimare i nostri dati. In questo caso:
Z = 0.001
f(x) = W * exp(x * Z)
dove abbiamo inizializzato il parametro Z
perché altrimenti la valutazione della funzione esponenziale exp(x * Z)
produce valori enormi, che porta a (in virgola mobile) Infinity e NaN nell'algoritmo di adattamento Marquardt-Levenberg, in genere non è necessario inizializzare il variabili - date un'occhiata qui , se volete saperne di più su Marquardt-Levenberg.
È il momento di adattare i dati!
fit f(x) "measured.dat" u 1:2:3:4 xyerrors via W, Z
Il risultato sarà simile
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
Dove ora W
e Z
sono riempiti con i parametri desiderati e le stime degli errori su quelli.
Il codice sottostante produce il seguente grafico.
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'
Terreno con impeto di measured.dat
Utilizzando il comando with xyerrorbars
visualizzerà errori stima sulla x e y. set grid
posizionerà una griglia tratteggiata sui tic principali.
Nel caso in cui le stime degli errori non siano disponibili o non importanti è possibile anche inserire i dati senza {y | xy | z}errors
opzione di montaggio degli {y | xy | z}errors
:
fit f(x) "measured.dat" u 1:2 via W, Z
In questo caso gli xyerrorbars
dovevano essere evitati.
Esempio di file "start.par"
Se carichi i parametri di adattamento da un file, dovresti dichiarare tutti i parametri che intendi utilizzare e, se necessario, inizializzarli.
## 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: interpolazione lineare di base di un set di dati
L'uso di base della vestibilità è meglio spiegato da un semplice esempio:
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)
Gli intervalli possono essere specificati per filtrare i dati utilizzati nel montaggio. I punti dati fuori range vengono ignorati. (T. Williams, C. Kelley - gnuplot 5.0, Un programma di plottaggio interattivo )
L'interpolazione lineare (adattamento con una linea) è il modo più semplice per adattare un set di dati. Supponiamo di avere un file di dati in cui la crescita della tua quantità y è lineare, puoi usarla
[...] polinomi lineari per costruire nuovi punti dati all'interno di un insieme discreto di punti dati noti. (da Wikipedia, interpolazione lineare )
Esempio con un polinomio di primo grado
Lavoreremo con il seguente set di dati, chiamato house_price.dat
, che include i metri quadrati di una casa in una determinata città e il suo prezzo in $ 1000.
### '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
Adatta questi parametri con gnuplot Il comando stesso è molto semplice, come puoi notare dalla sintassi, basta definire il tuo prototipo di adattamento, e poi usare il comando fit
per ottenere il risultato:
## m, q will be our fitting parameters
f(x) = m * x + q
fit f(x) 'data_set.dat' using 1:2 via m, q
Ma potrebbe essere interessante anche usare i parametri ottenuti nella trama stessa. Il seguente codice si inserisce il house_price.dat
file e quindi tracciare le m
e q
parametri per ottenere la migliore approssimazione della curva del set di dati. Una volta che hai i parametri puoi calcolare il y-value
, in questo caso il prezzo della casa , da un dato x-vaule
( metri quadrati della casa) appena sostituendo nella formula
y = m * x + q
il x-value
appropriato. Diamo un commento al codice.
0. Impostazione del termine
set term pos col
set out 'house_price_fit.ps'
1. Amministrazione ordinaria per abbellire il grafico
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. La giusta misura
Per questo, dovremo solo digitare i comandi:
f(x) = m * x + q
fit f(x) 'house_price.dat' via m, q
3. Salvare i valori di m
e q
in una stringa e tracciare
Qui usiamo la funzione sprintf
per preparare l'etichetta (racchiusa nel object rectangle
) in cui stamperemo il risultato della misura. Infine tracciamo l'intero grafico.
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
L'output sarà simile a questo.