martes, 19 de febrero de 2013

Fit Gausiano Gnuplot (Gaussian fit Gnuplot)

Hola de nuevo:

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.

lunes, 18 de febrero de 2013

Instalar Gnuplot Mac os x

Hoy explicaré como instalar Gnuplot (genera gráficos a través de una terminal)  en un Mac os x Intel.

Existen varias ayudas que a mi parecer son algo engorrosas, tediosas, y que no siempre funcionan (al menos en mi caso), pero daré a conocer una forma de instalar Gnuplot que es simple y que nos permitirá ejecutar scripts desde la terminal para hacer nuestro gráficos mas expeditos.



La manera mas fácil de hacerlo es via MacPorts, que debe ser instalado previamente (se debe tener instalado Xcode, si no lo tiene se debe instalar, es bastante pesado, así que paciencia :') ..)

Además se necesita instalarAquaTerm (no es necesario tener instalado X11) que son librerias que nos permiten ejecutar Gnuplot una vez instalado

Ahora bien, para tener totalmente actualizado Gnuplot y poder usar PDFcairo, debemos ejecutar las siguientes intrucciones en el prompt


DanyNash:~$sudo port install cairo
DanyNash:~$sudo port install pango
El codigo es bien parecido -sino igual- al: sudo apt-get install "lo que quieras instalar" en linux
(Ojo que DanyNash:~$ es el nombre de mi prompt de la terminal, esto no deben escribirlo, cada terminal tiene un Prompt por default, solo  deben escribir desde sudo en adelante, es decir, lo que esta marcado en amarillo)

esto tardara unos minutos (alrededor de 10 min por cada instalación). Finalmente, procedemos a instalar Gnuplor via Macports escribiendo la siguiente instrucción en la terminal :


DanyNash:~$sudo port install gnuplot


Y con esto tenemos instalado Gnuplot :).  Para probarlo en la terminal, sin importar en qué PATH estemos, escribimos gnuplot, es decir :


DanyNash:~$ gnuplot

Aparecera algo similar a esto:



G N U P L O T
Version 4.6 patchlevel 1    last modified 2012-09-26 
Build System: Darwin i386


Copyright (C) 1986-1993, 1998, 2004, 2007-2012

Thomas Williams, Colin Kelley and many others


gnuplot home:     http://www.gnuplot.info

faq, bugs, etc:   type "help FAQ"
immediate help:   type "help"  (plot window: hit 'h')


Terminal type set to 'aqua'

gnuplot> 

si queremos graficar la ecuacion cubica 4*x^3+x^2+x+2 solo escribimos

gnuplot> plot 4*x**3+x**2+x+2

y se desplegara una ventana similar a esta





Begining.. sumar? aparentemente algo intuitivo? Parte 2

... Hola a todos:

Continuaré lo que deje inconcluso en la entrada anterior. Demostraremos por inducción ver link para entender algo de inducción) que se cumple que la suma de los $n$ primeros naturales es $\frac{n}{2}(n+1)$, es decir: $$\sum_{k=1}^{n}k=\frac{n}{2}(n+1)$$.

El caso $n=1$ se cumple, como lo vimos anteriormente, luego tenemos nuestra hipotesis inductiva y debemos demostrar que se cumple para $n+1$ (continuando lo que se vio antes), por lo tanto debemos demostrar que  $$\sum_{k=1}^{n+1}k=\frac{n+1}{2}(n+2)$$


Demostracion:

Para demostrar lo que queremos, podemos mejorar un poco 'ultima  expresion y dejarla de la forma
$$\sum_{k=1}^{n}k+ (n+1)=\frac{n+1}{2}(n+2)$$

De lo cual identificamos que el 1er sumando del lado izquierdo  es la parte izquierda de la hipotesis inductiva. (entonces la demostracion se hara sumando a la hipotesis inductiva el termo n+1, lo cual nos deberia conducir al lado derecho de lo que queremos demostrar)

Entonces de la hipotesis inductiva tenemos

$$\sum_{k=1}^{n}k=\frac{n}{2}(n+1)$$

sumamos a ambos lados $(n+1)$ y tenemos
$$\sum_{k=1}^{n}k +(n+1)=\frac{n}{2}(n+1)+(n+1)$$

y sumando lo del lado derecho queda
$$\sum_{k=1}^{n}k +(n+1)=\frac{n(n+1)+2n}{2}$$
factorizamos por n+1
$$\sum_{k=1}^{n}k +(n+1)=\frac{n(n+1)+2(n+1)}{2}$$
$$\sum_{k=1}^{n}k +(n+1)=\frac{(n+1)(n+2)}{2}$$

y en el lado izquierdo incluimos el termino (n+1) en la sumatoria y demostramos lo que queriamos.
$$\sum_{k=1}^{n+1}k =\frac{(n+1)}{2}(n+2)$$



miércoles, 13 de febrero de 2013

Begining.. sumar? aparentemente algo intuitivo?

Hoy junto con mi hermano, iSaias, decidi crear un blog, con el fin de plasmar las cosas que he aprendido a lo largo de mi corta vida (22 años).

Hoy explicaré o "vomitaré" una de las primeras cosas que aprendi, y es... Aprender a sumar!!!

Si bien, es algo "intuitivo" contar, por lo que sumar aparentemente también lo es, pero al menos para mi no y fue una de las primeras cosas que aprendi cuando tenia 16 años...

.....no sabía sumar :-(...

..Pero en fin, hoy daré algunas luces de que sumar puede traernos algunos problemas, pero si lo hacemos en el orden correcto, nos traerá algunas sorpresas gratificantes :).

Si preguntara ¿Puedes sumar desde el número $1$ hasta número $10$ ?, ¿serías capaz?.

La respuesta para cualquier persona sería "obvio".Pues claro, todos realizamos la operación de sumar de a pares y de forma iterativa, es decir, $1+2=3$ , $3+3=4$, $4+4=8$, $8+5=13$... y así hasta llegar al $10$. Bien! trabajo completo, la suma da $55$ (es fácil de comprobar :P).

Cambiemos ligeramente la pregunta anterior por una como la siguiente

¿Puedes sumar desde el número $1$ hasta número $10$  en $2$ segundos?, ¿Serías capaz?

Y acá es donde sumar ya no es "obvio", y pasarán varios segundos hasta dar con la respuesta, lo que claramente responderia a nuestra interrogante como "No, creo que no puedo", ahora esto es algo como un desafío matemático ¿no?,pero no, no es un desafío matemático (al menos para mi), si no mas bien, un imperativo a que podemos sumar rapidamente, pero para lograrlo, debemos "saber" sumar. En el caso anterior, sumamos los números desde el 1 hasta el 10 de a pares y en un orden de menor a mayor, pero y si cambiamos el orden con el cual sumamos? Es decir, para qué sumar el 1 con 2 y  el resultado con 3 y así iterativamente, nadie nos obliga a hacer eso, solamente que estamos acostumbrados a hacerlo. Veamos que sucede si sumamos en el orden siguiente: El primero con el ultimo, el segundo con el penultimo, y asi hasta acabar con la totalidad de números que queremos sumar, osea:



es decir, queremos sumar


y en un principio lo sumamos en ese orden pero si cambiamos ligeramente lo anterior tenemos




con lo que obtenemos



Obtenemos el mismo resultado, es lo esperado, solo cambiamos el orden de los sumandos (Ley asociativa de la suma), pero de una forma mas corta que en la primera vez, solo tenemos que sumar una cantidad determinada de 11, y cuantos 11 tenemos que sumar?, la respuesta aflora, exactamente 5 veces, o mejor dicho la mitad del total de numeros que queriamos sumar, lo cual es logico, sumamos de a pares, por lo que habran 5 pares de numeros que tendremos que sumar. Entonces podemos deducir de lo anterio que la suma es simplemente igual a



y de manera mas clara aun podemos dejarlo como


Pero por qu'e dejarlo todo en funcion del ultimo numero?, pues es bastante util, sabiendo que si queremos sumar desde el 1 hasta el numero 100( por ejemplo), no tenemos que hacer todo lo anterio, solo basta con sumar 100+1 y multiplicar por la mitad de 100 es decir $\frac{100}{2}\cdot(100+1)=50*101=5050$ y ese es el resultado final.

Podemos generalizar esto, y decir, la suma de los primeros $n$ naturales viene dada por



En un lenguaje mas compacto, usando sumatorias, ser'ia



Seria bueno una demostraci'on no?, lo haremos por inducci'on

1)El caso para n=1, seria:




2) Tenemos nuestra hipotesis inductiva la cual es



3) Por demostrar que se cumple para n+1:


.... continuara :)