gnuplot vs numpy - data fit
Inviato: martedì 10 giugno 2014, 19:30
Ciao a tutti.
Ho bisogno di scambiare un paio di messaggi con voi per comprendere meglio la natura di un problema "bizzarro".
Sto facendo un data fit, molto semplice, per trovare la retta che meglio approssima un insieme di dati sperimentali.
Un fit lineare insomma.
I dati sperimentali sono disposti con precisione su una retta, come mostra il seguente grafico
in cui è visibile, in nero, la parte del dataset relativa ai tempi lunghi.
Il file logfree.dat contiene tutti i dati, non solo quelli disegnati in verde, ma anche quelli disegnati in nero.
il file logfree_TempiLunghi.dat contiene solo i dati disegnati in nero.
Ora, io dovrei fare il fit solamente sulla parte verde del grafico, ossia per tempi elevati.
Per fare una prova, dato che i dati sono praticamente tutti su di una retta, ho fatto due data fit con gnuplot.
... con gnuplot ottengo due risultati molto diversi tra loro!!!
Se faccio il fit lineare con tutto il dataset (tratto rosso e tratto nero), ottengo un risultato che *dovrebbe* essere quello corretto, infatti:
ottenendo un "best fit" che sta praticamente "sopra" i dati sperimentali
Se invece faccio il fit sulla sola parte nera, ovvero per i valori "elevati" dell'ascissa, ottengo un fit alquanto bizzarro:
che mi dà un fit che proprio non c'azzecca nulla con i dati sperimentali, neanche nella parte in cui ho fatto il fit...
Per curiosità, mi sono andato a guardare come poterlo fare con numpy... e ho constatato che i due fit producono risultati analoghi, come si può constatare confrontando il fit di tutto il dataset:
con il fit del solo dataset relativo alle ascisse elevate
È infatti abbastanza facile da constatare che i risultati (a parte ovviamente il segno - per B ottenuto con python), sono analoghi a quanto ottenuto con gnuplot... ma solamente per il fit con tutto il dataset.
Ho bisogno di scambiare un paio di messaggi con voi per comprendere meglio la natura di un problema "bizzarro".
Sto facendo un data fit, molto semplice, per trovare la retta che meglio approssima un insieme di dati sperimentali.
Un fit lineare insomma.
I dati sperimentali sono disposti con precisione su una retta, come mostra il seguente grafico
Codice: Seleziona tutto
plot 'logfree.dat' w l, "logfree_TempiLunghi.dat" w l lc black
Il file logfree.dat contiene tutti i dati, non solo quelli disegnati in verde, ma anche quelli disegnati in nero.
il file logfree_TempiLunghi.dat contiene solo i dati disegnati in nero.
Ora, io dovrei fare il fit solamente sulla parte verde del grafico, ossia per tempi elevati.
Per fare una prova, dato che i dati sono praticamente tutti su di una retta, ho fatto due data fit con gnuplot.
... con gnuplot ottengo due risultati molto diversi tra loro!!!
Se faccio il fit lineare con tutto il dataset (tratto rosso e tratto nero), ottengo un risultato che *dovrebbe* essere quello corretto, infatti:
Codice: Seleziona tutto
gnuplot> f(x) = A - B*x; fit f(x) "logfree.dat" via A, B
...
...
Final set of parameters Asymptotic Standard Error
======================= ==========================
A = 11.984 +/- 1.155e-07 (9.639e-07%)
B = 1.54444e-06 +/- 1e-14 (6.477e-07%)
Codice: Seleziona tutto
Final set of parameters Asymptotic Standard Error
======================= ==========================
A = 1 +/- 0.02197 (2.197%)
B = 9.21029e-07 +/- 1.251e-09 (0.1358%)
correlation matrix of the fit parameters:
A B
A 1.000
B 0.997 1.000 Codice: Seleziona tutto
>>> from __future__ import print_function
>>> import numpy as np
>>> dataX, dataY = np.loadtxt('logfree.dat', unpack = True)
>>> parametri = np.polyfit(dataX, dataY, 1)
>>> print(*parametri)
-1.54444381545e-06 11.9839684013Codice: Seleziona tutto
>>> dataX, dataY = np.loadtxt('logfree_TempiLunghi.dat', unpack = True)
>>> parametri = np.polyfit(dataX, dataY, 1)
>>> print(*parametri)
-1.54444319827e-06 11.9839601694