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: lnunez@uis.edu.co y nunez@ula.ve 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: alexander.f.walz@tonline.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]); 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.