Visualización Científica en MAPLE Gráficas Analíticas 2D

Anuncio
Visualización Científica en MAPLE
Luis A. Núñez
Escuela de Física, Fac Ciencias, Universidad Industrial de Santander, Bucaramanga-Colombia
Centro de Física Fundamental, Departamento de Física, Fac. de Ciencias, Universidad de Los Andes,
Mérida-Venezuela
e-mail: [email protected] y [email protected]
http://webdelprofesor.ula.ve/ciencias/nunez y http://cevale2.uis.edu.co/~cevale2/wiki/index.php/Luis_A.
_Nunez
creado: Noviembre 2003
actualizado: Marzo 2013
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 := x x sin x
y se grafica
plot(f(x), x = -99..99);
(1.1.1.1)
80
60
40
20
80
60
40
0
20
20
20
40
60
80
x
40
60
80
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);
4
3
y 2
1
10
5
0
5
x
10
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]
Ejemplos, escalas y etiquetas
plot(tan(x), x=-Pi..Pi);
2000
1000
3
2
0
1
1
2
3
x
1000
2000
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
4
tan(x)
2
3
2
0
1
1
2
3
x
2
4
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`]);
4
tan(x)
2
-Pi
-Pi/2
Pi/2
x
2
4
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]);
tan(x) vs x
tan(x)
4
-Pi
2
-Pi/2
Pi/2
x
2
4
Adicionalmente, también podemos explorar la función
g:=(x)->sin(x^2)/x^2;
sin x2
g := x
x2
plot(g(x),x=-2*Pi..2*Pi);
(1.1.3.1)
1.0
0.8
0.6
0.4
0.2
6
4
0
2
2
4
6
x
0.2
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);
sin(x^2)/x^2.
-2Pi
-3Pi/2
-Pi
1
0.5
Pi/2
3Pi/2
2Pi
x
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);
sin(x^2)/x^2.
0
x
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;
4
tan(x)
2
-Pi
-Pi/2
Pi/2
x
2
4
Podemos almacenar la gráfica para utilizarla en ésta u otra sesión de maple
save graftan,
"/Users/luisnunez/Desktop/Fisica/UIS/CursosUIS/Maple/Visual
izacion/tempGraf.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. Obviamente lla sintaxis del camino para almacenar las gráfica
dependerá del sistema operativo
graftan := NULL: # con esta expresion "aNULLamos" el valor
de la variable para luego asignarle otro
graftan;
read
"/Users/luisnunez/Desktop/Fisica/UIS/CursosUIS/Maple/Visual
izacion/tempGraf.m":
graftan;
4
tan(x)
2
-Pi
-Pi/2
Pi/2
x
2
4
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 := x4 1
1, 1, I, I
(1.2.1.1)
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
(1.2.1.2)
argumento:=polinonimo,x;
argumento := polinonimo, x
whattype(argumento);
exprseq
(1.2.1.3)
(1.2.1.4)
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
x=
69
,y=
35
y = 16
8
35
(1.2.1.5)
constituye el conjunto de soluciones, el cual, obviamente es equivalente a
solve( {ecua2, ecua1}, {y, x});
69
8
x=
,y=
35
35
(1.2.1.6)
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`);
f(x) vs x
6
x
4
2
10
0
5
5
f(x)
10
2
4
Finalmente, podremos representar un vector como
v:=array( [1+a,3+2*a +b,8+3*a+5*b+8*c]);
v := 1 a 3 2 a b 8 3 a 5 b 8 c
y verificarlo
type(v,list);
type(v,vector);
type(v,array);
(1.2.1.7)
false
(1.2.1.8)
true
(1.2.1.9)
true
(1.2.1.10)
una matriz
M:=array([ [1-p,2-q],[2-p*q,3-p^q] ]);
1 p 2 q
M :=
2 p q 3 pq
(1.2.1.11)
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);
1
0.5
3
2
0
1
1
2
3
4
wt
0.5
1
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]);
Posición, Velocidad y Aceleración
1
0.5
0
0.5
1
3
2
1
0
1
wt
2
3
4
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"]);
Posición, Velocidad y Aceleración
1
0.5
0
0.5
1
3
2
Posición
1
0
1
wt
Velocidad
2
3
4
Aceleración
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]);
Posición, Velocidad y Aceleración
4
3
2
1
3
2
0
1
1
2
3
4
wt
1
2
3
Posición
argumento
Velocidad
Aceleración
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);
3
2
1
0
1
2
3
x
1
2
3
o también
plot([sin(x),tan(x),x], x=0..Pi,view=[0..1.5, -2..2],scaling=
constrained,discont=true);
2
1
0
0.5
1
1.5
x
1
2
plot([sin(x),min(10,tan(x)), x], x = -Pi..Pi,discont=true);
3
2
0
1
1
2
x
500
1000
1500
2000
2500
plot([sin(x),max(-10,tan(x)), x], x = -Pi..Pi);
3
2500
2000
1500
1000
500
3
2
1
0
1
2
3
x
plot([sin(x),max(-5, min( 5, tan(x) ) ), x], x=-Pi..Pi,
scaling=constrained,discont=true);
4
2
3
2
0
1
1
2
3
x
2
4
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]);
1
0.5
0
0.2
0.4
0.6
0.5
1
igualemente
plot([sin(t^2), t, t = -2*Pi..2*Pi]);
0.8
1
6
4
2
1
0
0.5
0.5
1
2
4
6
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]);
2
xosc t := 2 sin
t
5
Velocidad
2
2
1
0
1
1
Posicion
2
1
2
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
, r sin
,0
2 , entonces pod
radio1 := 5:
plot([radio1*cos(t), radio1*sin(t), t = 0..2*Pi], scaling
= CONSTRAINED);
4
2
4
0
2
2
4
2
4
Polares
Una gráfica en coordenadas polares viene dada por la representación der = r
Si
consideramos un radio constante y graficamos su trayectoria variando el ángulo describimos
una circunsferencia centrada en el origen. Es equivalente a graficar una curva paramétrica del
lugar geométrico del tipo (x= r
, y= ) y se varía el parámetro 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
4
2
4
0
2
2
4
2
4
si por el contrario r
= sin
entonces
plot([sin(theta) , theta, theta=0..2*Pi],coords=polar,
scaling=constrained);
1
0.8
0.6
0.4
0.2
0.4
0.2
0
0.2
0.4
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));
2
1
2
Z 1
2 2
1
2 2
1 4 k a sin
1
2
1 := k,
(1.5.2.1)
4
4
1
4
k sin
2
1 k2
es la energía de dispersión que se considera fija; Z es el número atómico
2
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"]);
en la cual E :=
1
0.8
0.6
sigma
0.4
0.2
0
0
1
2
3
theta
4
5
6
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);
0.4
0.3
0.2
0.1
0
0.2
0.4
0.6
0.8
1
0.1
0.2
0.3
0.4
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);
4
:= 3 2 cos
2 cos
7
6
5
sigma
4
3
0
1
2
3
theta
4
5
6
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);
3
2
1
0
2
2
4
6
1
2
3
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):
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");
Grafica Semi log = eje x log
0.7
0.6
y
0.5
0.4
0.3
0.2
0.1
0
1
2
3
4
5
6
log10(x)
ln(3*x)/10
log[10](x)
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);
Grafica Semi log = eje y log
10 - 1
10 - 2
log10(y)
10 - 3
10 - 4
10 - 5
10 - 6
10 - 7
10 - 8
10 - 9
1
2
3
4
5
6
x
cos(x) + sen(x)
log[10](x)
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 );
Grafica Semi log = ejes x y log
10 - 1
log10(y)
10 - 2
10 - 3
10 - 4
10 - 5
10 - 6
1
2
3
4
5
6
log10(x)
cos(x) + sen(x)
log[10](x)
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");
Seno y Coseno
1
10
5
1
5
10
Un ejemplo más interesante lo constituye el movimiento bajo fuerzas centrales cuando
consideramos un potencial del tipo V r =
el cual es típico en el movimiento planetario o
r
en movimentos bajo fuerzas coulombinas. Es claro que = G m1 m2 para el caso de
gravitación universal newtoniana o = 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(thetatheta0));
1
r1 :=
(1.6.3.1)
1
cos
0
donde
=
L2
1
, la excentricidad, viene dado por
= 1
2E L2
Con
2
m
L la cantidad de movimiento angular; E la energía total. Nóteses que será positivo, para
potenciales atractivos ( > 0 ) y será negativo para potenciales repulsivos ( < 0). Igualmente
recordemos que la esta evolución corresponde a una representacion de secciones cónicas y las
m
y
1
2
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");
0 := 0
Secciones Cónicas
10
5
10
8
6
4
0
2
5
10
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);
1
xamort t :=
2
1
2
2
x0
2
0 x0
2
x0
2
2
0 x0
2
2
v0 e
02
t
(1.6.4.1.1)
2
0
v0 e
2
02
t
2
0
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 := 0.2581988898 I v0 e 0.5 1.936491673 I t
0.2581988898 I v0 e
0.5
1.936491673 I t
v0 = 10.000
3
2
1
0
2
4
6
8
10
t
1
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);
5 e
Xmu t :=
2
2
2
4
4
t
5 e
2
2
2
4
4
t
= 1.9900
2
1
0
2
4
6
8
10
t
1
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 );
t = 0.
0.6
0.4
0.2
0
5
10
x
15
20
0.2
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, frames=50 );
A = 2.
4
3
y
2
1
2.5
2
1.5
x
1
0
0.5
0.5
1
2
3
4
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);
1
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1
Animémosla con una secuencia de 16 cuadros con evolucionando de 0 con incrementos de
2
. Primeramente, construimos la secuencia de gráficas
16
plot_seq := seq(plot([[0,0], [cos(Pi/8*i),sin(Pi/8*i)]]
), i = 0..15):
display([plot_seq], insequence = true);
1
0.5
1
0
0.5
0.5
1
0.5
1
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");
The hand of time
1
0.5
1
0
0.5
0.5
1
0.5
1
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);
:= ln
x
1
2
y2
ln
x
1
2
y2
(1.6.5.1)
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);
2
1
0
1
2
2
1
0
1
Del mismo modo tendremos como gráficos de contorno
contourplot(phi, x=-2..2, y=-2..2,axes=box);
2
1.5
1
0.5
y
0
0.5
1
1.5
2
1
0
x
1
con más puntos y mas contornos es mucho más clara
contourplot(phi, x=-2..2, y=-2..2, numpoints=1000,
contours=50);
2
2
y
2
1
0
1
1
x
2
1
2
Pero aún se puede trabajar un poco más
contourplot(phi, x=-2..2, y=-2..2, numpoints=1000,
contours=50,
filled=true, coloring=[white,black] );
y si las hacemos en 3D, tendremos
implicitplot3d(z=phi, x=-2..2, y=-2..2, z= -3..3);
implicitplot3d(z=phi, x=-2..2, y=-2..2, z= -3..3,
numpoints=1000); # con muchos más puntos
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
((x1 , y1 , z1 ), (x2 , y2 , z2 ), ... ).
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);
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);
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);
30
25
20
15
10
5
1234567
Ydatos := 1, 8, 27, 11, 18, 20, 34
30
25
20
15
10
5
1234567
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
30
25
20
15
10
2
4
6
8
10
12
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
proc
option builtin = RandNumberInterface; end proc 6, 11, 4
end proc
listadatos :=
1
, 10 ,
9
1, 6 ,
1
,9 ,
2
1
,0 ,
10
1
,7
11
1
,5 ,
3
1
,1 ,
4
1
, 10 ,
5
1
,3 ,
6
1
,5 ,
7
1
,4 ,
8
10
8
6
4
2
0
0.1
1.0
Graficando Matrices
Igualmente podemos generar una matriz cuyos elementos sean números aleatorios
with(linalg):with(plots);
C := randmatrix(18,15,'sparse'): # generamos una matriz
rectangular 18x15
CT:=htranspose(C);
sparsematrixplot(C,matrixview);
animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d,
conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d,
densityplot, display, dualaxisplot, fieldplot, fieldplot3d, gradplot, gradplot3d,
implicitplot, implicitplot3d, inequal, interactive, interactiveparams, intersectplot,
listcontplot, listcontplot3d, listdensityplot, listplot, listplot3d, loglogplot, logplot,
matrixplot, multiple, odeplot, pareto, plotcompare, pointplot, pointplot3d, polarplot,
polygonplot, polygonplot3d, polyhedra_supported, polyhedraplot, rootlocus,
semilogplot, setcolors, setoptions, setoptions3d, spacecurve, sparsematrixplot,
surfdata, textplot, textplot3d, tubeplot
CT :=
0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0 ,
0, 0, 21, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 23, 27, 0, 0, 0 ,
0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 75, 91, 0, 0, 0, 0, 0, 0 ,
0, 89, 0, 0, 0, 19, 0, 52, 28, 0, 50, 0, 0, 0, 0, 0, 0, 44 ,
0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 10, 0 ,
23, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
0, 44, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 8, 0, 0, 0, 0 ,
0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 6, 0, 0, 0 ,
0, 37, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
0, 0, 0, 60, 62, 0, 0, 7, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 77, 0, 16 ,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 97, 0, 0, 0 ,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0 ,
0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0 ,
0, 0, 54, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 46, 0
1
5
column
10
15
18
1
2
4
row
6
8
10
12
14
15
También se pueden importar matrices de datos estándares de http://math.nist.gov/MatrixMarket/
A:=ImportMatrix
("/Users/luisnunez/Desktop/Fisica/UIS/CursosUIS/Maple/Visuali
zacion/bcsstk04.mtx", source=MatrixMarket);
sparsematrixplot(A, 'color=green',matrixview);
132 x 132 Matrix
A :=
Data Type: float8
Storage: sparselower
Order: Fortran_order
1
20
40
column
60
80
100
120 132
1
20
row
40
60
80
100
120
132
Más impresionante es el ejemplo que presenta Alexander F. Walz (E-mail: [email protected]) 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]);
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);
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);
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 );
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 =
, la cual
especifica el ángulo de presentación. Por omisión será 45, 45 , donde:
es la longitud o azimuth medida en grados a partir del eje positivo de las x ; 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);
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);
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.
Descargar