Visualización Científica en MAPLE

Luis A. Núñez
Centro de Astrofísica Teórica,

Departamento de Física, Facultad de Ciencias,

Universidad de Los Andes, Mérida 5101, Venezuela y,

Centro Nacional de Cálculo Científico, Universidad de Los Andes (CECALCULA),

Corporación Parque Tecnológico de Mérida, Mérida 5101, Venezuel
a
e-mail: nunez@ula.ve

actualizado: Noviembre 2003

Uno de los usos más impresionantes de las computadoras es la posibilidad de graficar resultados. Impresionantes superficies en 2D o gráficos de contorno, coloreados, impulsan nuestra intuición. Pero más aún, hoy en día es costumbre ver complicados gráficos de volúmenes los cuales se rebanan en distintos planos explorando los datos (minería de datos) igualmente las animaciones con distintos parámetros auxilian nuestra intuición. Hemos visto en las simulaciones anteriores que de las gráficas  podemos sacar cantidad de información que analíticamente si no es imposible es significativamente difícil. .

> restart;

Gráficas Analíticas 2D

Para comenzar utilizaremos el comando más básico para graficación. Igualmente cargaremos en memoria una biblioteca

de comandos gráficos

El comando plot

Generalidades de plot

Hay varias formas de contruir una función

> f :=(x) -> x*sin(x);

f := proc (x) options operator, arrow; x*sin(x) end proc

y se grafica

> plot(f(x), x = -99..99);

[Plot]

nótese el juego con los botones de arriba.

Igual se puede graficar la función directamente y seleccionar una visión particular

> plot(x*sin(x), x = -10..10, y=0..4);

[Plot]

La Sintaxis

La sintaxis del comando plot es la siguiente

plot(funcion-datos, horiz, vert, opciones)

All but the first argument are optional, but arguments must be given in the order shown above.

funcion-datos: expresión, mapping, lista o conjunto de datos a graficar

horiz / vert:

variable: etiquetas y ejes

rang0: determina el rango de graficación

variable = rango: ambos

opciones: ecuaciones de la forma  opción = VALOR

Para encontrar la lista de opciones se busca ?plot[options]

Warning, inserted missing semicolon at end of statement, ...rt, opciones);

Error, (in plot) invalid arguments

Ejemplos, escalas y etiquetas

> plot(tan(x), x=-Pi..Pi);

[Plot]

la escala vertical afecta la visión, para restringir la escala podemos proceder

> plot(tan(x), x=-Pi..Pi, `tan(x)`=-5..5);  # notese el entrecomillado inverso, ` `, para el eje vertical

[Plot]

Las comillas inversas `, se utilizan para encerrar textos que quisiéramos que se desplieguen en la gráfica.

nótese el símbolo de # que inhibe cualquier comando que lo siga.

Adicionalmente, vemos que las líneas verticales son espúrias. Para ello le podemos indicar al comando plot que la

función es discontínua

> plot(tan(x), x=-Pi..Pi, `tan(x)`=-5..5,discont=true,xtickmarks=[-3.14=`-Pi`,-1.57=`-Pi/2`,1.57=`Pi/2`,3.14=`Pi`]);

[Plot]

Incluimos en este comando, una manera más intuitiva de ver el eje x. En el eje y, las etiquetas se puenden voltear y el título de la grafica se puede colocar, si nos ponemos un poco más exquisitos.

> plot(tan(x), x=-Pi..Pi, `tan(x)`=-5..5,discont=true,xtickmarks=[-3.14=`-Pi`,-1.57=`-Pi/2`,1.57=`Pi/2`,3.14=`Pi`],
labels=[`x`,`tan(x)`],title=`tan(x) vs x`,labeldirections = [horizontal, vertical]);

[Plot]

Adicionalmente, también podemos explorar la función

> g:=(x)->sin(x^2)/x^2;

g := proc (x) options operator, arrow; sin(x^2)/x^2 end proc

> plot(g(x),x=-2*Pi..2*Pi);

[Plot]

y notamos que los ejes no tienen la misma escala, por lo cual nuestra intuición se puede ver traicionada, entonces a veces

es bueno colocar scaling=constrained

> plot(g(x),x=-2*Pi..2*Pi, `sin(x^2)/x^2.`=-0.5..1.5,
xtickmarks=[-6.28=`-2Pi`,-4.71=`-3Pi/2`,-3.14=`-Pi`,-1.57=`-Pi/2`,

                                  1.57=`Pi/2`,3.14=`Pi`,4.71=`3Pi/2`,6.28=`2Pi`],scaling=constrained);

[Plot]

Algunas veces las funciones son razonables y no evolucionan muy rápido

> plot(g(x),x=-infinity..infinity, `sin(x^2)/x^2.`=-0.5..1.5, scaling=constrained);

[Plot]

Asignación y manipulación de gráficas

Las gráficas se pueden asignar a variables para luego almacenarlas, imprimirlas o mostrarlas en pantalla. En ese caso para no ser testigo de la asignación de un inmenso y casi inenteligible conjunto de números, debemos terminar la asignación con dos punto :

> graftan:=plot(tan(x), x=-Pi..Pi,
`tan(x)`=-5..5,discont=true,xtickmarks=[-3.14=`-Pi`,-1.57=`-Pi/2`,1.57=`Pi/2`,3.14=`Pi`]):

luego podremos mostrar la gráfrica con solo invocar la varible

> graftan;

[Plot]

Podemos almacenar la gráfica para utilizarla en este u otra de maple

> save graftan, "c:/Luisn/Latex/cursos/visualizacion/graftan.m":

Nótese la forma de escribir el trayecto para almacenar el archivo y que el nombre del archivo debe tener la extensión .m para que MAPLE escriba el nombre de la variable y su asiganción en el formato interno de MAPLE. De esta forma el archivo es recuperable y se puede incluir en cualquier otra hoja de trabajo.

> graftan := NULL: # con esta expresion "aNULLamos" el valor de la variable para luego asignarle otro
graftan;

read "c:/Luisn/Latex/cursos/visualizacion/graftan.m":

graftan;

[Plot]

Como el archivo graftan.m contiene el nombre de la variable y su asignación, nos vimos abligados a "limpiar" el contenido de la variable antes de leerla del archivo donde fue almacenada. Esta acción no será necesaria si leemos esta gráfica desde otra hoja de trabajo MAPLE.

Disgresión en la estructura

Tipos de Datos, listas, conjuntos .....y  ¿ qué más

La visualización de los datos simpre impone conocer algo de la estructura con la cual estamos trabajando. Conocer los datos Y su estructura es vital para su representación gráfica. Exploraremos aquí algunas particularidades de la representación de datos utilizando esta herramienta. MAPLE dispone de diversas maneras de representar los datos. Veamos el siguiente ejemplo con el comando solve(eqn, var) que implica resolver una ecuación algebráica, eqn, para una de las variables involucradas var

> polinomio:=x^4-1; # shif + enter nos deja dentro del mismo grupo de comandos
solve(polinomio, x);

polinomio := x^4-1

-1, 1, I, -I

MAPLE nos devuelve una secuencia de soluciones. Ahora bien, si procedemos a especificar UNA de las soluciones, tendríamos que

> solve(polinomio, x)[1];

-1

> argumento:=polinonimo,x;

argumento := polinonimo, x

> whattype(argumento);

exprseq

claramente es una expresion de una secuencia !

Primeramente, diremos que utilizaremos de manera indistinta la palabra dato abstracto u objeto. En segundo lugar puntualizaremos que indicaremos estos objetos de distinto modo: mediante series de objetos separados por comas entre paréntisis (), objetos separados por comas entre llaves {} u objetos separados por comas entre corchetes []. Cada uno de estos conjuntos de objetos representa una estructura de datos distinta y tendrá una representación, utilización y un álgebra distinta. Nótese que ya hemos utilizado algunas de estas estructuras. Además de los argumentos de las funciones (objetos separados por comas dentro de paréntesis) en el caso de las etiquetas (labels=[,])

Consideraremos las siguientes estructuras de datos para graficar

Secuencias: Es el conjunto de datos u objetos separados por comas. Los argumentos de las funciones en MAPLE son, de acuerdo con esta definición, secuencias.

Conjuntos: Recuerda a la estructura y operación de los conjuntos matemáticos: es un conjunto de elementos separados por comas y encerrados entre llaves en los cuales los elementos aparecen un única vez y el orden de los elementos no importa. Pudiera decirse que un conjunto es una secuencia entre llaves.

Listas: Si un conjunto era una secuencia encerrada entre llaves, diremos ahora que una lista es un conjunto de conjuntos separados por comas encerrados entre corchetes, pero tambien es una secuencia encerrada entre llaves. A diferencia de los conjuntos el orden (y la posición) en el cual aparecen los elementos de la lista DEFINITIVAMENTE SI importa. Además los elementos pueden aparecer repetidos.

Arreglos: Este tipo de estructura de datos corresponde con la representación de vectores y matrices y en el caso de visualización utilizaremos las matrices para graficar archivos de datos experimentales

Tabla: La mencionamos por completitud, pero no abundaremos en su significado y uso, sólo diremos que es una estructura similar a la de registro (record) en lenguajes como Pascal o C.

Así, podemos ejemplificar lo anteriormente expuesto

> ecua1:=3*x +4*y=5;
ecua2:=8*x -y=16;

solve( {ecua1, ecua2}, {x, y});

ecua1 := 3*x+4*y = 5

ecua2 := 8*x-y = 16

{y = (-8)/35, x = 69/35}

constituye el conjunto de soluciones, el cual, obviamente es equivalente a  

> solve( {ecua2, ecua1}, {y, x});

{y = (-8)/35, x = 69/35}

y en contraposición al ejemplo anterior, si invertimos el orden de una lista, el resultado es otro

> plot(x*sin(x),x =-10..10,labels=[`f(x)`,`x`],title=`f(x) vs x`);

[Plot]

Finalmente, podremos representar un vector como

> v:=array( [1+a,3+2*a +b,8+3*a+5*b+8*c]);

v := vector([1+a, 3+2*a+b, 8+3*a+5*b+8*c])

y verificarlo

> type(v,list);

false

> type(v,vector);

true

> type(v,array);

true

una matriz

> M:=array([ [1-p,2-q],[2-p*q,3-p^q] ]);

M := matrix([[1-p, 2-q], [2-p*q, 3-p^q]])

Un mínimo de Operaciones con la estructura de datos

Operadores

>

Operaciones

>

Varias curvas en una gráfica

Para representar varias curvas en una gráfica utilizamos un conjunto de curvas. Esto es le dato abstracto conjunto por cuanto no repetiremos una curva y su orden no nos importará. De este modo, tendremos un conjunto como primer objeto de la secuencia que es el argumento de la función

> plot({sin(wt),-cos(wt),-sin(wt)}, wt = -Pi..1.5*Pi);

[Plot]

o acomodando un poco esta gráfica

> plot({sin(wt),-cos(wt),-sin(wt)}, wt = -Pi..1.5*Pi,
     scaling=constrained,

     title = "Posición, Velocidad y Aceleración",

     axes = BOXED,colour = [orange, blue,green]);

[Plot]

Pero no podemos colocar una leyenda para diferenciar curvas porque hemos graficado un conjunto de funciones y no una lista de funciones. Si queremos incluir una leyenda que diferencie las curvas en la gráficas, tenemos que graficar una lista de funciones donde el orden de las curvas importe.

> plot([sin(wt),-cos(wt),-sin(wt)], wt = -Pi..1.5*Pi,
       scaling=constrained,

       title = "Posición, Velocidad y Aceleración",

       axes = BOXED,

       colour = [orange, blue,green],

       legend = ["Posición", "Velocidad","Aceleración"]);

[Plot]

Pero también podremos representar el típo y el grosor de la línea para cuando no tengamos una impresión en colores

> plot([sin(wt),-cos(wt),-sin(wt),wt], wt = -Pi..1.5*Pi,
       scaling=constrained,

       title = "Posición, Velocidad y Aceleración",

       axes = normal,

       colour = [orange, blue,green,black],

       legend = ["Posición", "Velocidad","Aceleración","argumento"],

       linestyle=[1,2,3,4],

       thickness=[3,2,1,0]);

[Plot]

y todo lo anterior se puede cambiar utilizando las barra de herramientas que provee MAPLE cuando se marca la gráfica.

Explorando Curvas

Podemos trambien delimitar una ventana de visualizacion con la opción view= [xmax..xmin,ymax..ymin]  EL RANGO DE Y

> plot([sin(x),tan(x),x], x = 0..Pi, view=[0..Pi, -Pi..Pi],scaling=constrained,discont=true);

[Plot]

o también

> plot([sin(x),tan(x),x], x=0..Pi,view=[0..1.5, -2..2],scaling=constrained,discont=true);

[Plot]

> plot([sin(x),min(10,tan(x)), x], x = -Pi..Pi,discont=true);

[Plot]

> plot([sin(x),max(-10,tan(x)), x], x = -Pi..Pi);

[Plot]

> plot([sin(x),max(-5, min( 5, tan(x) ) ), x], x=-Pi..Pi,scaling=constrained,discont=true);

[Plot]

Variedades de Curvas

En los puntos anteriores hemos explorado la forma estándar de curva, esto es y(x) vs x, ahora trataremos de

explorar otros tipos

Paramétricas

Típicamente hemos visto curvas f(x) vs x y hemos graficado varias curvas en una misma gráfica f(t) vs t y g(t) vs t . Con ello lo que queremos decir es que graficamos el lugar geométrico tal que (x = t, y=f(t)) y ( x = t, y=g(t)) Ahora la idea es graficar ambas curvas etiquetadas por ese parámetro t tal que (x=f(t), y=g(t) ).Por ejemplo graficamos el lugar geométrico de todos los puntos  (t^2,t) tendremos que la sintaxis será clara,                 plot([x(t), y(t), t=rango de t], h, v, opciones) los dos primeros elementos de la lista del argumento seran x, y, variación del parámetro

> plot([t^2, t, t = -1..1]);

[Plot]

igualemente

> plot([sin(t^2), t, t = -2*Pi..2*Pi]);

[Plot]

En Física cuando graficamos la velocidad vs la posición llamamos a ese espacio el espacio de fases. Así para un oscilador armónico simple tendremos

> omega0:=2*Pi/5:
xosc(t):= 2*sin(omega0*t);

plot( [xosc(t), diff(xosc(t),t), t = -5..5], labels=[`Posicion`,`Velocidad`],labeldirections = [horizontal, vertical]);

xosc(t) := 2*sin(2/5*Pi*t)

[Plot]

Quizá el  ejemplo, más emblemático de representación paramétrica de una curva lo constituye la circunsferencia centrada en el origen que viene dada por el lugar geométrico, coordenadas cartesianas, de los puntos (x,y) -> (r*cos(theta), r*sin(theta)), 0 <= theta  < 2*Pi , entonces pod

> radio1 := 5:
plot([radio1*cos(t), radio1*sin(t), t = 0..2*Pi], scaling = CONSTRAINED);

[Plot]

Polares

Una gráfica en coordenadas polares viene dada por la representación der = r(theta)  Si consideramos un radio constante y graficamos su trayectoria variando el ángulo theta  describimos una circunsferencia centrada en el origen. Es equivalente a graficar una curva paramétrica del lugar geométrico del tipo (x= r(theta) , y= theta ) y se varía el parámetro theta  obviamente le indicamos a MAPLE que la gráfica viene en coordenadas plares. Si graficamos la misma circunsferencia centrada en el origen del punto anterior tendremos:

> radio2 :=5;
plot([radio2 , theta, theta=0..2*Pi],coords=polar);

radio2 := 5

[Plot]

si por el contrario r(theta) = sin(theta)  entonces

> plot([sin(theta) , theta, theta=0..2*Pi],coords=polar, scaling=constrained);

[Plot]

En la Aproximación de Born para dispersión elástica de electrones que inciden sobre átomos, se obtiene la expresión para la sección eficaz diferencial para el scatering apantallado de Rutherford.

> sigma1:=(k,theta)->(1/4)*( (Z^2*(1-(1/(1+4*k^2*a^2*sin(theta/2)^2)^2))^2)/(k^4*sin(theta/2)^4));

sigma1 := proc (k, theta) options operator, arrow; 1/4*Z^2*(1-1/(1+4*k^2*a^2*sin(1/2*theta)^2)^2)^2/(k^4*sin(1/2*theta)^4) end proc

en la cual E := k^2/2  es la energía de dispersión que se considera fija; Z  es el número atómico y a corresponde con el factor de apantallamiento. Si graficamos la sección eficaz diferencial respecto al ángulo, nos queda algo como

> plot(subs(a=1/2,Z=1,sigma1(1,theta)), theta=0..2*Pi, labels=["theta","sigma"]);

[Plot]

es mucho más intuitiva si realizamos la gráfica en coordenadas polares.

> plot([subs(a=1/2,Z=1,sigma1(1,theta)), theta, theta=0..2*Pi], coords= polar,scaling=constrained);

[Plot]

Es mucho más evidente el patrón de dispersión el valor de la función para cada ángulo. Algo parecido presenta R. Landau en el patrón de dispersión de Rayos x de baja energía dispersados por una esfera

> sigma:=3+2*cos(theta)^4 + 2*cos(theta);
plot(sigma, theta=0..2*Pi, labels=["theta","sigma"], scaling=constrained);

sigma := 3+2*cos(theta)^4+2*cos(theta)

[Plot]

no es obvia la forma del patrón de dispersión cosa que es clara cuando se grafica en término de coordenadas polares

> plot([sigma, theta, theta=0..2*Pi],coords=polar,scaling=constrained);

[Plot]

El Paquete plots

El paquete plots aumenta las posibilidades de graficación al incluir un conjunto de "comandos" adicionales. Las funciones del plots se pueden invocar directamente haciendo referencia al paquete plots. Esto es: plots[setoptions](scaling = CONSTRAINED). Lo más común es que se utilicen directamente como setoptions(scaling = CONSTRAINED), luego de incorporar el paquete completo de funciones como lo es usual en MAPLE a través del comando

> restart;with(plots):

Warning, the name changecoords has been redefined

Los nombres que arriba aparecen hacen intuir la funcionalidad del comando. Mostraremos el uso de algunas de las opciones y dejaremos al lector explorar algunas de las otras mediante la utilización de la ayuda en línea.

Cambio de opciones por  omisión

Lo primero que exploramos en el uso de los nuevos comandos que provee el paquete plots es la posibilidad de crear un conjunto, personalizado de opciones por omisión. Así las opciones por omisión pueden ser alteradas mediante

> setoptions(scaling = CONSTRAINED);

Opción que será supuesta por omisión a partir de este momento y la cual pude ser revertida mediante:

setoptions(scaling = UNCONSTRAINED);

Gráficas Logarítmicas

Seguidamente exploraremos otra de las opciones de plots que permite realizar gráficas logarítmicas, mediante los comandos logplot (eje vertical logarítmico), semilogplot (eje horizontal logarítmico) loglogplot (ambos ejes logarítmicos)

Así tendremos que

> semilogplot([ln(3*x)/10,log[10](x)], x=1..2*Pi,
labels=["log10(x)","y"],labeldirections = [horizontal, vertical],legend = ["ln(3*x)/10","log[10](x)"],

title="Grafica Semi log = eje x log");

[Plot]

> logplot([ln(3*x)/10,log[10](x)], x=1..2*Pi,
labels=["x","log10(y)"],labeldirections = [horizontal, vertical],legend = ["cos(x) + sen(x)","log[10](x)"],

title="Grafica Semi log = eje y log",numpoints=500);

[Plot]

Nótese como hemos aumentado el número de puntos de graficación a través de la opción numpoints=500

> loglogplot([ln(3*x)/10,log[10](x)], x=1..2*Pi,
labels=["log10(x)","log10(y)"],labeldirections = [horizontal, vertical],legend = ["cos(x) + sen(x)","log[10](x)"],

title="Grafica Semi log = ejes x y log",numpoints=500 );

[Plot]

>

Otra vez, varias Gráficas en una: la función display

Otra forma de representar varias curvas en una sola gráfica es a través de la función display del paquete plots. Esta función permite mostrar varias gráficas mediante la asignación de gráficas a variables, para luego "mostrar" el conjunto de variables. Así el ejemplo más trivial lo constituye las g[raficas del seno y el conseno. Esto es

> S := plot(sin):  C := plot(cos):
display({S,C}, title = "Seno y Coseno");

[Plot]

Un ejemplo más interesante lo constituye el movimiento bajo fuerzas centrales cuando consideramos un potencial del tipo V(r) = -alpha/r  el cual es típico en el movimiento planetario o en movimentos bajo fuerzas coulombinas. Es claro que alpha = G*m1*m2  para el caso de gravitación universal newtoniana o alpha = -q1*q2  para el caso de las fuerzas coulombianas. Para este caso la trayectoria de los cuerpos sometidos a la acción de la fuerza que deriva del potencial será

> r1:=(theta)->lambda*(1+epsilon)/(1+epsilon*cos(theta-theta0));

r1 := proc (theta) options operator, arrow; lambda*(1+epsilon)/(1+epsilon*cos(theta-theta0)) end proc

donde lambda = abs(L)^2/(m*alpha*(1+epsilon))  y  epsilon , la excentricidad, viene dado por  epsilon = (1-2*E*abs(L)^2/(m*alpha^2))^(1/2)  Con L la cantidad de movimiento angular; E la energía total. Nóteses que  lambda será positivo, para potenciales atractivos (alpha > 0 ) y será negativo para potenciales repulsivos ( alpha < 0). Igualmente recordemos que la esta evolución corresponde a una representacion de secciones cónicas y las cuales se ilustran

> theta0:=0;
rElipse := subs (lambda=1,epsilon=1/2,r1(theta)):

rParabola := subs (lambda=1,epsilon=1,r1(theta)):

rHiperbolaP := subs (lambda=1,epsilon=2,r1(theta)):

rHiperbolaN := subs (lambda=-1,epsilon=2,r1(theta)):

grfrElipse:=plot([rElipse,theta,theta=0..2*Pi],coords=polar, color=red):

grfrParabola:=plot([rParabola,theta,theta=0..2*Pi],coords=polar, color =green ):

grfrHiperbolaP:=plot([rHiperbolaP,theta,theta=0..2*Pi],coords=polar, color =blue ):

grfrHiperbolaN:=plot([rHiperbolaN,theta,theta=0..2*Pi],coords=polar,color =yellow):

display([grfrElipse,grfrParabola,grfrHiperbolaP,grfrHiperbolaN], view=[-10..1,-10..10], title="Secciones Cónicas");

theta0 := 0

[Plot]

Explorando el comportamiento de datos con animaciones.

Existen dos formas de representar animaciones con MAPLE: una limitada utilizando el comando animate y otra forma utilzando el

comando display  analicemos ambos casos

Animaciones con animate

La sintaxis del comando animate es animate(pcomandoplot, argplot, t=a..b,...) Este comado genera una gráfica y al seleccionarla aparecen botones parecidos a los controles de una videograbadora.

Consideremos la solución sub-amortiguada del oscilador libre, amortiguado

> restart;with(plots):
xamort(t) := 1/2*(mu*x0+(mu^2-omega0^2)^(1/2)*x0+v0)/(mu^2-omega0^2)^(1/2)*exp((-mu+(mu^2-omega0^2)^(1/2))*t)-1/2*(mu*x0-(mu^2-omega0^2)^(1/2)*x0+v0)/(mu^2-omega0^2)^(1/2)*exp((-mu-(mu^2-omega0^2)^(1/2))*t);

Warning, the name changecoords has been redefined

xamort(t) := 1/2*(mu*x0+(mu^2-omega0^2)^(1/2)*x0+v0)*exp((-mu+(mu^2-omega0^2)^(1/2))*t)/(mu^2-omega0^2)^(1/2)-1/2*(mu*x0-(mu^2-omega0^2)^(1/2)*x0+v0)*exp((-mu-(mu^2-omega0^2)^(1/2))*t)/(mu^2-omega0^2)...

Para analizar su comportamiento bajo variación de parámetros, podemos considerar un par de formas de animar esa gráfica.

Primeramente, consideremos variaciones de la velocidad inicial para un coeficiente de amortiguamiento, una masa y una constante

elástica dada. Esto es

> paramV:=[x0=0,mu=0.5,omega0=2]:Xv(t):=subs(paramV,xamort(t));
animate(plot,[Xv(t),t=0..10],v0=1..10);

Xv(t) := -.2581988898*I*v0*exp((-.5+1.936491673*I)*t)+.2581988898*I*v0*exp((-.5-1.936491673*I)*t)

[Plot]

También podemos explorar el comportamiento bajo variacioes del coeficiente de amortiguamiento, estos es

> parammu:=[x0=0,v0=5,omega0=2]:Xmu(t):=subs(parammu,xamort(t));
animate(plot,[Xmu(t),t=0..10],mu=0.1..1.99, frames=100);

Xmu(t) := 5/2*exp((-mu+(mu^2-4)^(1/2))*t)/(mu^2-4)^(1/2)-5/2*exp((-mu-(mu^2-4)^(1/2))*t)/(mu^2-4)^(1/2)

[Plot]

También se pueden superponer una animación con un fondo

> ondaseno := plot( sin(x)*exp(-x/5),x=0..20 ):
animate( pointplot, [ [[t,sin(t)*exp(-t/5)]],symbol=circle,symbolsize=10],

        t=0..20, frames=60, background=ondaseno );

[Plot]

y comparar la evolución de una curva respecto a otra

> curva := implicitplot( x^3+y^2, x=-3..1, y=-4..4, color=blue ):
animate( implicitplot, [x^3-A*y+y^2,x=-3..1,y=-4..4],

        A=-2..2, background=curve, frames=50 );

Error, (in animate) background value must be a real number or a plot structure

>

Animaciones utilizando  display

Con la opción insequence = true, display combina una lista gráficas que cambian con el tiempo así, la gráfica (paramétrica ) de una línea recta

> setoptions(scaling = CONSTRAINED);
plot([[0,0], [cos(Pi/4),sin(Pi/4)]], 0..1, 0..1);

[Plot]

Animémosla con una secuencia de 16 cuadros con theta evolucionando de 0 con incrementos de  2*Pi/16 . Primeramente, construimos la secuencia de gráficas

> plot_seq := seq(plot([[0,0], [cos(Pi/8*i),sin(Pi/8*i)]]), i = 0..15):
display([plot_seq], insequence = true);

[Plot]

Igual que el caso anterior, podemos animar una grárfica sobre, con otra gráfica fija.

> display({%,  # la animacion anterior
  plot([cos(t), sin(t), t = 0..2*Pi])},  # el circulo fijo

  title = "The hand of time");

[Plot]

Campos y Contornos

Para ejemplificar una de las mejoras con el uso de las extensiones de plots supongamos dos lineas con cargas opuestas e infinitas, situadas perpendiculares al plano x,y que lo atraviezan en las posiciones (-1,0,0) y (1,0,0) el potencial electrostático vendrá dado por

> phi := ln(sqrt((x+1)^2)+y^2) -ln(sqrt((x-1)^2)+y^2);

phi := ln(((x+1)^2)^(1/2)+y^2)-ln(((x-1)^2)^(1/2)+y^2)

una gráfica que muestra la intensidad de estas líneas de potencial surge de

> gradplot(-phi,x=-2..2, y=-2..2,arrows=thick, grid=[11,11], axes=box);

[Plot]

Del mismo modo tendremos como gráficos de contorno

> contourplot(phi, x=-2..2, y=-2..2,axes=box);

[Plot]

con más puntos y mas contornos es mucho más clara

> contourplot(phi, x=-2..2, y=-2..2, numpoints=1000, contours=20);

[Plot]

Pero aún se puede trabajar un poco más

> contourplot(phi, x=-2..2, y=-2..2, numpoints=1000, contours=20,
                filled=true, coloring=[white,black] );

[Plot]

y si las hacemos en 3D, tendremos

> implicitplot3d(z=phi, x=-2..2, y=-2..2, z= -3..3);

[Plot]

> implicitplot3d(z=phi, x=-2..2, y=-2..2, z= -3..3, numpoints=5000); # con muchos más puntos

[Plot]

Pero podemos ir más allá y exportar estas gráficas a un formato vrml (virtual reality markup language) el cual es posible explorarlo con cualquier navegador

> grfcargas:=implicitplot3d(z=phi, x=-2..2, y=-2..2, z= -3..3,numpoints=500): # asigno la grafica a una variable
vrml( grfcargas, `c:/Luisn/Latex/cursos/visualizacion/cargas.wrl`):

Curvas en el espacio

El paquete plots  permite dibujar curvas en el espacio. El comando no puede ser más intuitivo plots[spacecurve]. Por su parte la sintaxis del comando es escencialmente la misma que las curvas paramétricas definidas en 2D. En general representaremos una curva en el espacio parametrizada por una variable esto es

(x(t), y(t), z(t)), a <= t  <= b

y también podemos representarla mediante puntos que serán unidos

((x[1], y[1], z[1] ), (x[2], y[2], z[2] ), ... ).

por segmentos de rectas. Así, la curva paramétrica de una hélice circular en el espacio queda representada por

> spacecurve([cos(t), sin(t), t, t=0..2*Pi], colour = BLACK, axes = NORMAL);

[Plot]

y nudos en el espacio

> knot:= [ -10*cos(t) - 2*cos(5*t) + 15*sin(2*t),
        -15*cos(2*t) + 10*sin(t) - 2*sin(5*t), 10*cos(3*t), t= 0..2*Pi]:

spacecurve(knot,axes=framed);

[Plot]

Puntos y Archivos de Datos Experimentales

Puntos y Listas

Cuando se refiere a graficar datos experimentales debemos graficar objetos numéricos. Estos objetos pueden provenir de variables numéricas generadas en la solución de un problema o archivos numéricos de datos experimentales. Presentaremos aqui un par de ejemplos, uno de ellos que proviene del comando listplot(Lista, opciones)  del paquete plots. Este comando realiza una gráfica 2D para una lista de números que corresponden a las coordendas y de un punto (x,y), asignando los valores de x por omisión en forma consecutiva. Así

> listplot([1, 8, 27, 11, 18, 20, 34]); # graficará estos valores asignandol la lista x = [1,2,3,4,5,6,7]
Ydatos := [1, 8, 27, 11, 18, 20, 34]; # o equivalentemente con solo puntos

listplot(Ydatos,style = POINT, symbol = DIAMOND, color=red);

[Plot]

Ydatos := [1, 8, 27, 11, 18, 20, 34]

[Plot]

Si queremos graficar los puntos (x,y) con x particulares, tendremos que proveer, de forma explícita, el valor de las x con

Lista = [[x1,y1],.[x2,y2],.[x3,y3], .. ,[xn,yn]]

> XYdatos:= [[2, 8], [4,27], [6,11], [8,18], [10,20], [12,34]]; # o equivalentemente con solo puntos
listplot(XYdatos,style = POINT, symbol = DIAMOND, color=red);

XYdatos := [[2, 8], [4, 27], [6, 11], [8, 18], [10, 20], [12, 34]]

[Plot]

o un poquito más elaborado

> r := rand(0..10);  # Entero aleatorio dentro de un rango especificado
listadatos := [seq([1/(n+1),r()], n=0..10)];  # construyo la lista de puntos

listplot(listadatos,style = POINT, symbol = DIAMOND, color=red);

r := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end procr := proc () local t; global _seed; _seed := irem(a*_seed, p); t := _seed; to concats do _seed := irem(a*_seed, p); t := s*t+_seed end do; irem(t, divisor)+offset end proc

listadatos := [[1, 9], [1/2, 4], [1/3, 1], [1/4, 4], [1/5, 4], [1/6, 1], [1/7, 3], [1/8, 8], [1/9, 9], [1/10, 9], [1/11, 2]]

[Plot]

>

Graficando Matrices

Igualmente podemos generar una matriz cuyos elementos sean números aleatorios

> with(linalg):
C := randmatrix(18,15,'sparse'): # generamos una matriz rectangular 18x15

CT:=htranspose(C);

sparsematrixplot(C,matrixview);

Warning, the protected names norm and trace have been redefined and unprotected

CT := matrix([[0, 0, 0, -19, 40, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, -68, 25, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 0, 0, 0, 43, 0, 0, 0, 0, -67, -48, 0, 0, 0, 0, 0, 0, 0], [99,...CT := matrix([[0, 0, 0, -19, 40, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, -68, 25, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 0, 0, 0, 43, 0, 0, 0, 0, -67, -48, 0, 0, 0, 0, 0, 0, 0], [99,...CT := matrix([[0, 0, 0, -19, 40, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, -68, 25, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 0, 0, 0, 43, 0, 0, 0, 0, -67, -48, 0, 0, 0, 0, 0, 0, 0], [99,...CT := matrix([[0, 0, 0, -19, 40, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, -68, 25, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 0, 0, 0, 43, 0, 0, 0, 0, -67, -48, 0, 0, 0, 0, 0, 0, 0], [99,...CT := matrix([[0, 0, 0, -19, 40, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, -68, 25, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 0, 0, 0, 43, 0, 0, 0, 0, -67, -48, 0, 0, 0, 0, 0, 0, 0], [99,...CT := matrix([[0, 0, 0, -19, 40, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, -68, 25, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 0, 0, 0, 43, 0, 0, 0, 0, -67, -48, 0, 0, 0, 0, 0, 0, 0], [99,...

[Plot]

También se pueden importar matrices de datos estándares de http://math.nist.gov/MatrixMarket/

> A:=ImportMatrix("d:/Luisn/Latex/cursos/visualizacion/bcsstk04.mtx", source=MatrixMarket);
sparsematrixplot(A, 'color=green',matrixview);

Error, (in ImportMatrix) file or directory does not exist

Error, invalid input: sparsematrixplot expects its 1st argument, A, to be of type {Matrix, matrix}, but received A

Más impresionante es el ejemplo que presenta  Alexander F. Walz (E-mail:  alexander.f.walz@t-online.de) en http://www.math.utsa.edu/mirrors/maple/maplev.html en este ejemplo se procesa un archivo que contiene la información de la ubicación de 22.000 galaxias, convierte estos datos a un formato que pueda ser utilizado por MAPLE y luego los vuelva a procesar para graficarlos en 3D dependiendo de su distancia al Sol. Finalemente los convierte al formato vrml para que pueda ser explorado con cualquier navegador de INTERNET

>

Gráficas Analíticas 3D

Gráficas 3D implícitas con plots

Funciones implícitas con implicitplot3d

Tal y como vimos antes, se pueden graficar superficies con la utilización de a biblioteca plots la sintaxis del comando es

implicitplot3d(expr, x=a..b, y=c..d, z=p..q, opciones)

Nótese a continuación que la opción grid = [k, l, m] indica que la malla de la superfice es k x l x m . La opción por omisión es 10 x 10 x 10.

De esta forma tenemos

> restart;with(plots):implicitplot3d(x^3+y^3+z^3+1=(x+y+z+1)^3, x=-2..2, y=-2..2, z=-2..2, grid=[15,15,15]);

Warning, the name changecoords has been redefined

[Plot]

y en distintos sistemas de coordenadas

> implicitplot3d(r=(1.3)^x*sin(y), r=0.1..5, x=-1..2*Pi, y=0..Pi, coords=spherical);

[Plot]

y utilizando listas o conjuntos para superponer gráficas

> implicitplot3d([(x+2)^2+(y+2)^2+(z+2)^2=9, (x-2)^2+(y-2)^2+(z-2)^2=6], x=-5..5, y=-5..5, z=-5..5, color=[blue,green], scaling=constrained, axes=boxed);

[Plot]

>

Graficando Funciones Complejas con

Funciones de variable compleja f(z) = f(x + i y) = ( re f, im f), pueden graficadas utilizando el comando

complexplot3d(f(z), z=a + b*I..c + d*I) y el rango de "variación" de z viene dado por a + b*I..c + d*I

Esto puede verse como

> complexplot3d( sec(z) , z = -2 - 2*I .. 2 + 2*I,axes=framed );

[Plot]

juegue con los botones, note los ejes y compruebe la forma como se grafica funciones complejas.

>

Gráficas 3D Analíticas con plot3d

El comando plot nos permitió graficar funciones analíticas que dependian de una sola variable, del mismo modo se pueden graficar funciones de dos variables. El comando será El comando plot nos permitió graficar funciones analíticas que dependian de una sola variable, del mismo modo se pueden graficar funciones de dos variables. plot3d y es similar su uso al comando plot sólo que, por tratarse de gráficas de funciones de varias variables,  requerirá especificar un rango de variación para cada variable.

La sintaxis del comando es también similar al comando  plot

plot3d(f(x,y), x=a..b, y=c..d, opciones)

plot3d(f, a..b, c..d, opciones)

las opciones title, axes y scaling operan igual que para  el comando plot de gráficas 2D. La única particularidad para el caso plot3d que la opción axes tiene por valor de omisión NONE, es decir, ningún eje aparecerá a menos que se lo indiquemos a MAPLE. Adicionalemente, para 3D existe la necesidad de especificar la orientación orientation = [theta, phi] la cual especifica el ángulo de presentación. Por omisión será [45, 45] , donde:

theta es la longitud o azimuth medida en grados a partir del eje positivo de las  x ; phi representa la colatitud medida, también en grados, partiendo del eje positivo de las z.y finalmente view = rango de z (o una lista que especifique los rangos para x,y,z ).Estos parámetros aparecen indicados en la barra de herramientas una vez que se selecciona la figura utilizando el ratón.

Esto es

> plot3d(sin(x+y), x=-1..1, y=-1..1);

[Plot]

Más allá de las especificaciones en las opciones, se puede interactuar con la gráfica mediante los botones de control que aparecen cando se selecciona la región de la gráfica.

De igual modo se puede especificar la gráfica 3D en forma paramétrica esto es que cada una de las coordenadas dependa de dos parámetros

(x(s, t), y(s, t), z(s, t)), a <= s  <= b , c <= t  <= d .

que se traduce a la siguiente sintaxis

plot3d([x(s,t), y(s,t), z(s,t)], s=a..b, t=c..d)

y obviamente el rango que aparace es el de los parámetros que etiquetan a las coordenadas.

> plot3d([cos(t),sin(t),z], t=0..2*Pi, z=-1..1);

[Plot]

>

Gráficas 3D para datos experimentales

De los mejores usos que se le puede dar a esta herramienta está la posiblidad repesentar superficies provenientes de datos experimentales y a partir de allí manipularlos para buscar relaciones entre ellos.

>

>

>