Hoy daré a conocer como realizar FIT en Gnuplot, a partir de un archivo de datos, de extensión ".txt" o ".dat". Debo decir que esto en un principio trajo algunos problemas con amigos de la universidad cuando queriamos hacer un fit del tipo Gausiano a unos datos que poseían dicha tendencia.
Existen varios programas para realizar Fit, entre ellos Mathematica, Matlab, Maple, incluso Microsoft Excel (aunque con este ultimo la inclusion de datos mediante un archivo ".txt" no es del todo confortable). En la explicación de hoy, usaremos como bien dijimos Gnuplot para hacer fit y no usaremos algunos de los programas mencionados anteriormente (quizás más adelante explique como hacer cosas con alguno de esos tres programas), entonces manos a la obra.
Realizaremos un fit tipo Gaussiano, el archivo de datos que deseamos "fitear" lo llamaremos gaussian.txt (lo pueden descargar haciendo click derecho en cada nombre y eligiendo la opcion de "Save link As.." ) que corresponde a un dato experimental de un haz tipo gaussiano.
Ejecutamos gnuplot desde la terminal pero en el PATH o carpeta donde se encuentre el archivo ".txt" (simplemente por comodidad para no escribir el path del archivo una vez que ejectumos gnuplot )
DanyNash:~$ gnuplot
Para plotear los puntos, simplemente debemos escribir
DanyNash:~$ plot "gaussian.txt"
Desplegandose el siguiente gr'afico
Para hacer el fit del tipo Gausiano, debemos primero definir una funci'on de ese tipo en gnuplot para despues obligarlo a que fitee los puntos con la distribucion dada por la funci'on. Entonces una gausiana no es m'as que una funcion del tipo $$f(x)=\displaystyle Ae^{-\frac{(x-b)^2}{2c^2}}$$ entonces en gnuplot escribimos nuestra funcion
gnuplot> f(x)=A*exp(-(x-b)**2/(2*c**2))
y damos enter. Luego todo se resume a encontrar los mejores valores de A,b y c tal que se ajusten a los datos que tenemos. No podemos como en el caso del fit Lineal simplemente escribir en gnuplot fit f(x) "gausian.txt" via A,b,c ya que el resultado seria desastroso y gnuplot no har'a el fit correctamente, si hacemos lo anterior el resultado del fit para los valores A, b y c seria el siguiente
A = 0.000839799 +/- 99.56 (1.186e+07%)
b = 1.00009 +/- 1.413e+05 (1.413e+07%)
c = 0.999333 +/- 1.56e+05 (1.561e+07%)
El porcentaje de error es elevado, y claramente los calores no concuerdan en absoluto con lo que uno espera, por ejemplo, el valor de A es A=0.000839799, y en nuestros datos se ve claramente que la amplitud es cercana al valor 250, el valor de b (donde est'a centrada la gaussiana) deberia estar cerca del 700 pero en cambio el valor obtenido por el fit es b=1.000, lo cual obviamente no es el correcto.
Para solucionar lo anterior, debemos dar algunos par'ametros iniciales al fit, de tal manera de "ayudarlo" y que realice el fit correctamente, para esto una vez definida la funci'on, le damos parametros iniciales a las 3 constantes que definimos, es decir, a,b,c. Sabemos que la amplitud A esta cerca de 255 y que el centro esta cerca a 700, del $c^2$ que es la varianza no tenemos una intuici'on r'apida de qu'e valor puede adoptar (podemos ir mas all'a y deducir un valor para c^2 con lo anterior, pero en este caso no lo haremos), as'i que este ser'a nuestro parametro que deberiamos cambiar hasta lograr un buen fit. Entonces una vez definida la funci'on la funci'on damos los parametros iniciales (antes de hace el fit) y luego hacemos el fit:
gnuplot> A=255; b=700;c=1
gnuplot> fit f(x) "gaussian.txt" via A,b,c
Partimos con c=1 y el resultado final fue el siguiente
...
initial set of free parameter values
A = 255
b = 700
c = 1
w = 0 in Givens(); Cjj = -3.77725e-282, Cij = 9.87711e-267
error during fit
No logro hacer el fit, luego cambiamos el valor de c por 1000
gnuplot> A=255; b=700;c=1000
gnuplot> fit f(x) "gaussian.txt" via A,b,c
y el resultado es el siguiente
Final set of parameters Asymptotic Standard Error
======================= ==========================
A = 256.513 +/- 0.8714 (0.3397%)
b = 688.646 +/- 0.4702 (0.06828%)
c = 119.836 +/- 0.4702 (0.3924%)
correlation matrix of the fit parameters:
A b c
A 1.000
b 0.003 1.000
c -0.577 -0.003 1.000
Lo cual nos dice que logro hacer el fit y los valores de A=256.513, b=688.646 y c=119.836. Finalmente para graficar los datos y el plot juntos solo hacemos replot f(x)
gnuplot> replot f(x)
y el resultado es el siguiente
y con esto finalizamos :).
Como dato extra, gnuplot crea un archivo llamado "fit.log", donde se encuentra toda la informacion de los fit que se desplegaron en la terminal.