Graficando datos con Maple
Los datos deben ser leidos con el comando "readdata". Si estamos trabajando en una maquina bajo Unix, Windows o Mac el formato de lectura cambia ligeramente. Aqui se escriben algunos ejemplos que muestran la manera correcta para especificar el camino en donde esta ubicado el archivo datos.txt
> data:=readdata(`MacHD:cpug:datos:datos.txt`,numcols): => Mac
> data:=readdata(`c:/cpug/datos/datos.txt`,numcols): => Windows
> data:=readdata(`/home/hector/datos/datos.txt`,numcols): => Unix
El segundo argumento de "readdata" es el numero de columnas que se quiere leer. Los datos son leido como una lista de listas de la forma
[[fila 1 dato1],[fila 2 dato2], ..., [fila_n dato_n]],
donde cada fila es a la vez una lista
dato_n => [valor1,valor2, ..., valor_numcols].
Mas informacion puede obtenerse al escribir:
>?readdata
En este primer ejemplo se tiene un archivo de datos llamado datos01.txt , que contiene 2 columnas con 101 filas. Las primeras dos lineas y las ultimas dos lineas de este archivo son:
0 0.3528340285
0.1 0.3618782685
: :
: :
. .
9.9 0.01904239283
10
0.01334321559
> | restart: |
> | numcols:=2: |
> | datos1:=readdata(`/home/hector/datos/datos01.txt`,numcols): |
Se puede pedir que se muestre algunos de los elementos de la lista anterior
> | datos1[1];datos1[50];datos1[101]; |
Es necesario convertir los datos en un arreglo de dimensiones [numfils x numcols], con ayuda del comando "nops" (numero de operandos) se puede hacer de la manera siguiente
> | numfils:=nops(datos1); |
> | A:=array(1..numfils,datos1): |
> | plot(A,title=`Ejemplo 1`,titlefont=[HELVETICA,18],labels=[x,y],labelfont=[HELVETICA,16],axesfont=[HELVETICA,14],tickmarks=[4,4]); |
En el siguiente ejemplo el archivo datos02.txt es un archivo que contiene 51 columnas y 101 filas. Las primeras dos lineas y las ultimas dos lineas de este archivo son:
0.0 92.92035398230088 . . . . . 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 92.92035398230088 0.0
0.0 14.89949861693958 . . . . . 54.734818015084606 42.681775294291434 29.281398898890416 14.89949861693958 0.0
: : :
: : :
0.0 0.031604239614923056 . . . . . 0.0943143011065842 0.06308375173468966 0.031604239614923056 0.0
0.0 0.029886390566035575 . . . . . 0.08918784546561599 0.05965483320230009 0.029886390566035575 0.0
De manera general, es un archivo que puede tener la siguiente estructura para representar una funcion z=f(x,y)
| y0 y1 y2 . . . . . . . yn
- - |--------------------------------
x0 | z00 z01 z02 . . . . . . . z0n
x1 | z10 z11 z12 . . . . . . . z1n
: | : : : :
xm | zm0 zm1 zm2 . . . . . zmn
pero que no continene de manera esplicita los valores de las variables x y y , es decir es un arreglo que contiene solo los valores de z.
> | restart:with(plots):with(linalg): |
Warning, the name changecoords has been redefined
Warning, the protected names norm and trace have been redefined and unprotected
> | numcols:=51: |
> | datos2:=readdata(`/home/hector/datos/datos02.txt`,numcols): |
> | datos2[1]; |
> | numfils:=nops(datos2); |
En la siguiente instrucción se construye un arreglo de [numfils x numcols] elementos
> | B:=array(1..numfils,1..numcols,datos2): |
Si se quiere ver alguno de estos elementos se escribe:
> | B[1,50]; |
Una vez contruido el arreglo, es posible hacer directamente un plot 3D con el comando "matrixplot"
> | matrixplot(B,axes=boxed,labels=[x,y,z],style=patchcontour,labelfont=[HELVETICA,14],axesfont=[HELVETICA,9],tickmarks=[5,5,5],title=`Ejemplo 2`,titlefont=[HELVETICA,18],orientation=[-70,70]); |
El comando "matrixplot" funciona considerando que el espaciamiento de la malla de puntos es uniforme. De no ser asi, es necesario conocer como es el espaciamiento de la malla o incluir los valores x y y junto con los valores de z en el archivo de datos. Se puede hacer uso del comando "surfdata" para graficar la superficie utilizando los datos completos x,y,z .
Para contruir una malla uniforme que contenga la lista de listas de puntos x,y,z de manera completa se puede utilizar el comando "seq" para hacer una sucesión de elementos, como se muestra a continuación:
> | lista_datos:=[seq([seq([i,j,B[i,j]], j=1..numcols) ], i=1..numfils)]: |
> | lista_datos[1]; |
Se puede ver que el primer item de esta lista es [1,1,0] y es una lista de puntos que corresponden al primer valor de la variable x, es decir, es una lista de la forma [x0,y0,z00]. El siguiente es [x0,y1,z01], y asi sucesivamente. Y ahora la grafica,
> | surfdata(lista_datos,labels=[x,y,z],axes=boxed,style=patchcontour,labelfont=[HELVETICA,14],axesfont=[HELVETICA,9],tickmarks=[5,5,5],title=`Ejemplo 2b`,titlefont=[HELVETICA,18],orientation=[-70,70]); |
Si el archivo de datos es de la forma
x0 y0 z00
x0 y1 z01
: : :
x1 y0 z10
x1 y1 z11
: : :
xm yn zmn
es decir, contiene de manera explicita los valores de x y y se debe proceder como se muestra a continuacion:
> | datos3:=readdata(`/home/hector/datos/datos03.txt`,3): |
> | datos3[1];datos3[5005]; |
Los datos, tal como estan, no pueden ser operados con el comando "surfdata" ya que son una lista de puntos y no una lista de listas de puntos. Es necesario entonces construir la lista de listas con el comando "seq",
> | C:=[seq([seq(datos3[(i-1)*numcols+j],j=1..numcols)],i=1..numfils)]: |
Ahora tenemos los datos como en el ejemplo anterior.
> | C[1]; |
> | surfdata(C,labels=[x,y,z],axes=boxed,style=patchcontour,labelfont=[HELVETICA,14],axesfont=[HELVETICA,9],tickmarks=[5,5,5],title=`Ejemplo 3`,titlefont=[HELVETICA,18],orientation=[-70,70]); |
FIN.
> |