Capítulo 5 Programación científica en Python Hasta ahora hemos visto las bases para crear programas sencillos en Python. Para poder crear programas un poco más poderosos es conveniente saber usar algunas herramientas más fuertes como la librería numérica de Python, numpy, junto con algunos consejos que pueden resultar útiles a la hora de hacer un programa más elaborado. 5.1. Numpy Acrónimo de Python numérico en inglés, esta librería provee una de las herramientas más útiles en el cómputo científico: los arreglos n-dimensionales. Para definir un arreglo de este tipo se utiliza array: >>a=array([1.2,2.2,4.5]) Cabe destacar que se utilizan tanto los paréntesis como los paréntesis cuadrados, en ese orden, al momento de definir un arreglo entrada por entrada. Si en cambio se requiere de un arreglo de números consecutivos se puede utilizar arange: >>> b=arange(0.1,1,0.1) >>> print b [ 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] >>> los argumentos de arange son (origen, final, tamaño del paso). En caso de que no se especifíque el tamaño del paso, éste será por default 1. Si no se específica el origen, éste será por default 0. También se pueden definir arreglos con puros ceros o unos: 57
58 CAPÍTULO 5. PROGRAMACIÓN CIENTÍFICA EN PYTHON >>> b=zeros(10).reshape(2,5) >>> b array([[ 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0.]]) >>> b=ones(10) >>> b array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) reshape(2,5) da la forma en dos filas y 5 columnas. Se pueden hacer muchas cosas con los arreglos. Tomando nuestro arreglo b del ejemplo anterior, b.ndim: nos dice el número de dimensiones del arreglo. b.size: nos dice el número de elementos que contiene el arreglo. b.shape: nos dice la forma del arreglo en número de filas y columnas. También puede cambiar la forma del arreglo usandob.shape=2,5 donde 2 y 5 son las filas y columnas respectivamente. b.transpose(): transpone el arreglo. Si era un arreglo de 2 filas y 5 columnas, pasa a ser de 5 filas y 2 columnas. b.ravel(): reordena el arreglo en una sola fila b.sum(): suma todos sus elemetos. Se pueden agregar argumentos a sum() para sumar los elementos de las columnas o de las filas usandoaxis=0 óaxis=1. b.min(): da el valor mínimo de los elementos. También se pueden usar como argumentos los ejes. b.max(): lo mismo que el anterior sólo que ahora es el máximo. Una de las grandes ventajas de numpy es que permite un manejo sencillo de los arreglos. De esta manera, si dos arreglos son del mismo tamaño podemos sumarlos o restarlos. >>> a=ones(3) >>> a array([ 1., 1., 1.]) >>> b=ones(10) >>> b array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) >>> a+b Traceback (most recent call last): File "<stdin>", line 1, in <module>
5.2. MATPLOTLIB 59 ValueError: shape mismatch: objects cannot be broadcast to a single shape >>> a=ones(10) >>> a+b array([ 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]) >>> a-b array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) También se pueden añadir reales a todos los números del arreglo >>> a+sin(pi/2) array([ 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.]) Si los arreglos se usan como matricesdot(a,b) regresa el producto de las dos matrices con las mismas condiciones que se requieren para un producto de matrices. Otra de las partes más útiles de esta librería es la de álgebra lineal. Algunas de las funciones que se pueden realizar con ella son: linalg.inv(a) linalg.eig(a) La primera encuentra la inversa de la matriz A y la segunda nos devuelve los eigenvectores y eigenvalores de la matriz A en un arreglo. 5.2. Matplotlib Podríamos decir que con estas librerías tenemos cubierta buena parte del álgebra necesaria para solucionar muchos problemas físicos. Sin embargo todavía no podemos graficar todos los resultados obtenidos sin tener que usar alguna herramienta exterior. matplotlib es una de las mejores y más desarrolladas herramientas para gráficas 2D que junto con numpy y scipy forman pylab, una alternativa para matlab. Para usar pylab de manera similar a matlab usamos la versión interactiva de python: ipython -pylab Una vez ahí podemos graficar cosas muy fácilmente por medio del comando plot() que toma como argumento la función que se quiere graficar t=arange(0.0, 2.0*pi, 0.1) plot (t) plot (t,t) plot(sin(t), cos(t))
60 CAPÍTULO 5. PROGRAMACIÓN CIENTÍFICA EN PYTHON Se pueden colocar nombres a los ejes usando xlabel( nombre ) y ylabel( nombre ). Tambien se puede colocar una malla de fondo como referencia usandogrid(true). Para colocar dos funciones en una misma gráfica usamos t = arange(0.0, 5.0, 0.05) s1 = sin(2*pi*t) s2 = s1*exp(-t) plot(t, s1, t, s2) Se puede agregar una leyenda con el comando legend(( sine wave, damped exponential )) Se pueden también hacer subgráficas (Figura 5.1): from pylab import * def f(t): return cos(2*pi*t) * exp(-t) t1 = arange(0.0, 5.0, 0.1) t2 = arange(0.0, 5.0, 0.02) subplot(211) l = plot(t1, f(t1), bo, t2, f(t2), k ) grid(true) title( 2 subplots ) ylabel( Damped ) subplot(212) plot(t2, cos(2*pi*t2), r> ) grid(true) xlabel( time (s) ) ylabel( Undamped ) show() Se pueden visualizar otras cosas como números aleatorios (Figura 5.2): from pylab import * clf() X = rand(20,20) im = imshow(x) pcolor(x) Es fácil cargar y guardar archivos usando pylab, simplemente se usa el comando load( filename ) para cargar ysave( filename,x) para guardar un arregloxenfilename.
5.2. MATPLOTLIB 61 Damped 1.0 0.8 0.6 0.4 0.2 0.0-0.2-0.4-0.6 2 subplots -0.8 0 1 2 3 4 5 1.0 Undamped 0.5 0.0-0.5-1.0 0 1 2 3 4 5 time (s) Figura 5.1: Ejemplo de subgráficas 0 5 10 15 20 0 5 10 15 20 Figura 5.2: Ejemplo de visualización de números aleatorios
62 CAPÍTULO 5. PROGRAMACIÓN CIENTÍFICA EN PYTHON
Capítulo 6 Gnuplot 6.1. Gnuplot Una alternativa a la librería gráfica de Python matplotlib es gnuplot. Gnuplot es una herramienta sencilla pero poderosa para dibujar funciones y archivos de datos en 2 y 3 dimensiones e imprimir los resultados en varios tipos de formatos gráficos. Es una herramienta de línea de comandos, no tiene interfaz gráfica 1. La versión actual es 4.2 y se encuentra en su página http://www.gnuplot.info. Existen muchos tutoriales al respecto y una página con muchos ejemplos de su uso es http://gnuplot.sourceforge.net/demo4.2. Existe también un newsgroup donde se puede solicitar ayuda en comp.graphics.apps.gnuplot. Además el programa tiene ayuda interna que se puede consultar con el comandohelp, como por ejemplohelpplot. 6.1.1. Gráficas 2D Para dibujar funciones en 2D basta usar el comandoplot seguido de la función que se quiere graficar, usando como variable ax, o el nombre del archivo en el cual están los datos entre comillas ( ) o una sola comilla ( ), plot sin(x) plot "datos.dat" Se pueden definir variables y funciones: a=3 plot sin(a*x) f(x)=sin(a*x) plot a=1, f(x) title sin(x), a=2, f(x) title sin 2x, a=3, f(x) t sin 3x 1 Para ello se puede utilizar xmgrace para gráficas en 2D 63
64 CAPÍTULO 6. GNUPLOT Para graficar varias funciones en una sola gráfica basta con separar las funciones por comas, como se muestra en el ejemplo. Se pueden tambien poner títulos con title seguido del nombre entre comillas. Muchas de las opciones en gnuplot se pueden abreviar y no se debe poner toda la palabra para que el programa lo interprete. En este caso podemos resumirtitle con sólo unat. Las funciones las evalúa en varios puntos. Para ver como lo hace podemos poner plot sin(x) with points plot sin(x) w p set samp 500 set xlabel Eje x set ylabel Eje y replot Podemos establecer el número de puntos consetsamp y editar los nombres de los ejes conset xlabel ysetylabel. Al editar algún cambio de formato en la gráfica no debemos escribir de nuevo el comandoplot con todas las funciones sino que basta con ponerreplot. Por default todas las gráficas se muestran en un interfaz gráfico, pero quizá requerimos las gráficas en un archivo para su posterior uso. Para ello debemos establecer la terminal donde se va a imprimir la gráfica y el nombre del archivo que se quiere crear, set term png set out grafica.png Para saber que formatos gráficos se pueden utilizar se puede consultar la ayuda interna de set term. Se puede regresar al terminal original usandosettermpop. También podemos usar la línea de comandos del bash desde gnuplot sin tener que abrir otra ventanta del terminal usando!. Así podemos visualizar las imágenes guardadas con!kghostview sin.eps!ps2pdf sin.eps!kpdf sin.pdf Dondekghostview es un programa para visualización de archivos postcript ykpdf para archivos pdf. 6.1.2. Gráficas con archivos de datos Cuando se grafica directamente desde un archivo se puede determinar que datos en específico del archivo se quieren utilizar. Para dibujar la primera y segunda columna se usa indistintamente,
6.1. GNUPLOT 65 plot in.dat using 1:2 plot in.dat u 1:2 Se pueden combinar los valores de diferentes columnas usando $. De esta manera si queremos graficar la columna 1 con la suma de las columnas 2 y 3 escribimos, plot in.dat u 1:($2+$3) Recordando el uso de los paréntesis. Podemos dibujar algunos datos con el comandoevery, plot in.dat every 10 Se pueden usar barras de errores con plot in.dat w errorbars Se pueden escoger distintos tipos de líneas y puntos usando plot "in.dat" w lp lt 3 lw 3 pt 5 ps 1.5 Dondelt es el tipo de línea,pt el tipo de punto,lw el ancho de línea yps el tamaño de los puntos. Otros estilos de representación se pueden consultar conhelpplotstyle. También se pueden especificar los rangos usando: set xrange [3:10] set xange auto set yrange [4:10] 6.1.3. Scripts Si se van a hacer muchas gráficas con un mismo formato se pueden utilizar scripts de manera que no se tenga que volver a escribir todo el formato de la gráfica cada que se quiere graficar. Para ello sólo se tiene que crear un archivo con la terminación.gp. Los comandos se escriben uno por renglón para que los pueda interpretar gnuplot. Por ejemplo, si tenemos el archivo sin.gp que contiene una línea que diceplotsin(x), basta con escribir en una terminalgnuplot-persist sin.gp para que se muestre la gráfica en pantalla. El-persist es para que se mantenga la imagen por tiempo indefinido y no sólo se muestre y desaparezca.
66 CAPÍTULO 6. GNUPLOT 6.1.4. Gráficas 3D Para graficar en 3D usamos el comandosplot en lugar deplot. La segunda variable está dada poryde manera que podemos hacer gráficas como, splot sin(x)*cos(y) Se puede usar el ratón para rotar la figura y el botón de enmedio para expandir y contraer la imagen. Podemos tener una vista desde arriba consetviewmap. Para dibujar datos en 3 dimensiones con colores podemos usar splot "datos.dat" u 1:2:3:4 pal Donde la cuarta columna corresponde apal que es la paleta de colores. Se puede variar la paleta consetpalette. También se pueden hacer contornos con set contour surface set cntrparam levels auto 10 6.1.5. Proceso de datos Se puede dibujar nada más una parte de un archivo de datos usando un truco, si gnuplot ve NaN ( Not a Number ), entonces no dibuja nada. Entonces, se emplea el operador ternario: (a>0)? a : NaN que quiere decir: si a>0, entonces devolver el valor a; si no, devolver NaN. Por ejemplo, plot "in.dat" u ($1>0? $1 : NaN):2 dibujará los datos que tienen primera columna mayor que 0 nada más. Los datos en un archivo se pueden procesar antes de dibujarse asi: gnuplot "< awk {print $1, $2+$3} in.dat" En este ejemplo se puede hacer lo mismo directamente en gnuplot, pero puede ser muy útil. Por ejemplo, supongamos que hay dos archivos, 1.dat y 2.dat, que tienen la misma primera columna, y queremos dibujar la segunda columna del primer archivo contra la segunda columna del segundo archivo:
6.1. GNUPLOT 67 gnuplot "< join 1.dat 2.dat" u 2:3 6.1.6. Gnuplot y L A TEX gnuplot tiene la facilidad de mandar las etiquetas de las gráficas a L A TEX, set term epslatex blacktext color 9 dl 2 size 8.0cm, 5.5cm standalone Dondedl es dash length (longitud de las puntillas) ystandalone produce un archivo L A TEXcompilable. Sinstandalone produce un.tex que hay que usar con\include{test.tex}. Así se puede tener más control sobre el output. Para ir ajustando la salida, conviene guardar los comandos que generan la gráfica en un script. 6.1.7. Macros También se pueden hacer macros con set macros estilo = "every 5 u 1:10 w lp" plot "1.dat" @estilo, "2.dat" @estilo Donde@estilo se reemplaza con el texto definido.