viernes, octubre 12, 2007

Graficando con octave y gnuplot

Si hay que visualizar una gráfica a partir de su función, lo que tal vez se intente es abrir una hoja de cálculo, poner números seguidos (que representan a los valores de x), y en la celda contigua poner una formúla que calcule el valor de cada punto x para generar los datos de la función.

Después tal vez, al asistente de gráficos, pedir una gráfica xy dispersión, seleccionar los valores y listo, ya está la gráfica.

Pero es mucho más simple si está instalado octave y gnuplot.

El programa octave es una aplicación orientada a cálculo numérico, muy parecido a Matlab, mientras que gnuplot es una aplicación cuyo único propósito en la vida es graficar; y octave se ayuda de éste para desplegar los datos de manera visual.

Para poder hacer gráficas de funciones con estas dos herramientas se realiza lo siguiente

Se invoca octave
>$ octave
que genera su propio prompt de ejecución, donde se escriben los comandos para octave.

Teniendo ya el prompt de octave, se define los datos de x, y por supuesto, los datos de f(x).

octave> x = -0.99:0.1:5

Esto genera un vector de datos que comienza en -0.99 y que va de 0.1 en 0.1 hasta 5

ocvave> y=(log((x+1)/e)).^2

Y lo anterior genera los datos de y, que es el cuadrado del logaritmo natural de la división de x más uno entre el valor del número e.

Para calcular el cuadrado de cada uno de los elementos de un vector, hay que anteponer un punto antes del circunflejo, o marcará error. No va presedido de punto si la variable contiene solo un escalar.

Y para graficar simplemente

octave> plot(x,y)

que genera una gráfica de dos dimensiones con los valores de x y de f(x).

Etiquetas:

domingo, octubre 07, 2007

microtip: Usando xarg

En ocaciones se desea ejectuar algunos comandos, a los que se les pase como argumento el resultado de ejecutar comados previos. Ésto se logra usando el "entubamiento", es decir, se usan pipetas, tuberias, pipes o como prefieran llamarlo.

Significa redireccionar el flujo de salida de un comando, y conertirlo en la entrada de otro comando, lo cual se consigue usando el caracter "|" (barra vertical, pipe en inglés).

Por ejemplo, si se desea buscar todas las líneas que hay en un archivo que contengan una palabra en particular, basta con usar los comandos cat y grep para obtener el resultado deseado:

>$ cat archivo_interes.txt | grep palabra

En ocaciones lo que se necesita hacer, resulta repetitivo y no parece ser tan conveniente el uso del pipe, como en el caso de querer hacer directorios que tengan alguna forma particular, y que para facilidad los nombres estén contenidos dentro de un archivo.

Hasta aquí, parece que lo más conveniente es hacer un script y en un bucle, ir recorriendo el archivo linea por línea e ir ejectuando el comando con el argumento obtenido del archivo.

Sin embargo, existe un comando en *NIX que puede simplicar un poco el proceso, al permitir pasar el resultado de un comando, como entrada a otro comando, ejecutando vez a vez el resultado anterior, mediante el uso del pipe (|). Es decir, si el comando anterior devuelve como entrada un par de líneas, cada una de ellas será pasada como argumento al comando que esté posterior a xargs y se ejecutará 2 veces.

Por ejemplo, suponiendo que se desea crear una serie de subdirectorios, que se encuentran en un archivo, con xargs se puede hacer de la siguiete forma:

>$ cat /ruta/donde/esta/archivo.txt | xargs mkdir -p

Lo cual crea un directorio por cada línea obtenida del archivo mendiante cat.

Otro ejemplo, que se desea borrar todos los archivos que sean *.tmp y que no se sabe donde se encuentran. El comando find puede hacer la tarea de encontralos, y rm de eliminarlos, siendo algo parecido a:

>$ find / -name "*.tmp" -print | xargs rm

Sin embargo tener presente que si la tarea es más complicada, es conveniente evaluar si es mejor usar un script o no.

Para más detalles:

>$man xargs

En la wikipedia:

http://en.wikipedia.org/wiki/Xargs