UNIVERSIDAD TECNOLÓGICA DE PEREIRA Programa de Tecnología Eléctrica Matlab Introducción Taller No.2 Programación TE243 Ing: José Norbey Sánchez Grupo: 2. Gráficos en dos y tres dimensiones: 2.1 Gráficos en dos dimensiones MATLAB dispone de cuatro funciones básicas para crear gráficos 2-D. Estas funciones se diferencian principalmente por el tipo de escala que utilizan en los ejes de abscisas y de ordenadas. Estas cuatro funciones son las siguientes: plot() loglog() semilogx() semilogy() Crea un gráfico a partir de vectores y/o columnas de matrices, con escalas lineales sobre ambos ejes. Ídem con escala logarítmica en ambos ejes. Ídem con escala lineal en el eje de ordenadas y logarítmica en el eje de abscisas. ïdem con escala lineal en el eje de abscisas y logarítmica en el eje de ordenadas. En lo sucesivo se hará referencia casi exclusiva a la primera de estas funciones (plot). Las demás se pueden utilizar de un modo similar. Existen además otras funciones orientadas a añadir títulos al gráfico, a cada uno de los ejes, a dibujar una cuadrícula auxiliar, a introducir texto, etc. Estas funciones son las siguientes: fplot parcela una función entre los límites especificados imread Lee la imagen de una fila especificada imshow Muestra la imagen de una fila especificada linspace Genera n puntos entre un intervalo definido title('título') Añade un título al dibujo. xlabel('tal') Añade una etiqueta al eje de abscisas. Con xlabel off desaparece. ylabel('cual') Añade una etiqueta al eje de ordenadas. Con ylabel off desaparece text(x,y,'texto') Introduce 'texto' en el lugar especificado por las coordenadas x e y. Si x e y son: vectores, el texto se repite por cada par de elementos. Si texto es también un vector de cadenas de texto de la misma dimensión, cada elemento se escribe en las coordenadas correspondientes. gtext('texto') Introduce texto con ayuda del ratón: el cursor cambia de forma y se espera un clic para introducir el texto en esa posición. 1 legend() define rótulos para las distintas líneas o ejes utilizados en la figura. Para más detalle, consultar el Help grid activa la inclusión de una cuadrícula en el dibujo. Con grid off desaparece la cuadrícula. Ejemplo: Generar una señal sinusoidal de amplitud unitaria. t=0:pi/100:2*pi; seno=sin(t); plot(t,seno) Ejemplo: También se graficar punteando dos vectores m y t que tengan la misma dimensión: t=[-5 -4.5 -3 -2 0 1 1.5 4 4.5 5]; m=[20 10 12 4 15 18 3 20 4 7]; Si se desea graficar m contra t, se digita: plot(t,m) Si queremos cambiar color o delineado de la curva escribimos plot(t,m,’r’) para color rojo, otros colores como y(amarillo), g(verde), w(blanco) y k(negro); si se digita plot(t,m,’r--’), aparece la curva punteada, otras formas .,+,*,o,:, etc. También se puede colocar etiquetas a la curva con los comandos: xlabel(‘t(segundos)’) y ylabel(‘m(amperios)’), se adiciona el texto entre comillas simples a los ejes x y y respectivamente como se muestra en la siguiente figura. 2 Ejemplo: graficar la función anterior y colocarle etiquetas t=[-5 -4.5 -3 -2 0 1 1.5 4 4.5 5]; m=[20 10 12 4 15 18 3 20 4 7]; plot(t,m) xlabel('t(segundos)') ylabel('m(amperios)') Mediante el comando gtext(‘Curva ilustrativa’) se puede adicionar el texto entre comillas (siempre con la figura abierta) donde se posicione el cursor y se haga el correspondiente clik. En este caso se desplegará en la curva. Si se desea concentrar la atención en una determinada zona de la curva se puede utilizar el comando axis([-4 -2 8 14]) donde los dos primeros elementos del vector son las coordenadas horizontales y los dos últimos las coordenada verticales. Ver figura. Ejemplo: ampliar los ejes en ([-4 -2 8 14]) y escribir en la gráfica “curva ilustrativa” t=[-5 -4.5 -3 -2 0 1 1.5 4 4.5 5]; m=[20 10 12 4 15 18 3 20 4 7]; plot(t,m) xlabel('t(segundos)') ylabel('m(amperios)') gtext('Curva Ilustrativa') axis([-4 -2 8 14]) 3 Se pueden hacer lecturas directamente de la curva mediante el comando ginput, ejemplo como tomar dos lecturas de la curva: [x,y]=ginput(2) t=[-5 -4.5 -3 -2 0 1 1.5 4 4.5 5]; m=[20 10 12 4 15 18 3 20 4 7]; plot(t,m) xlabel('t(segundos)') ylabel('m(amperios)') [x,y]=ginput(2) x= 0.0115 1.0945 y= 14.8684 15.9737 grid on Para la ubicación de los puntos se puede habilitar convenientemente un reticulado mediante la instrucción grid on como aparece en la siguiente figura. Si se quiere deshabilitar se digita grid off. En caso de necesitarse dibujar un gráfico adicional sobre la misma gráfica anterior se usa el comando hold on. Por ejemplo para superponer dos funciones: Ejemplo: generar dos vectores de 9 datos, graficar y luego superponerle una función seno clc t=[-2 -1 0 1 2 3 4 5 6]; m=[1.3 -1.3 1.1 -1.2 0 -0.9 1.2 1.6 1]; plot(t,m) 4 A la gráfica anterior le superponemos una función seno con hold on. hold on; t=0:pi/100:2*pi; seno=sin(t); plot(t,seno) El comando hold of deshabilita lo asociado. Las dos gráficas anteriores podrían mostrarse en dos subgráficas una debajo de la otra y separadas por fila, pertenecientes a una misma ventana, usando el comando subplot(m,n,p), se genera una matriz de m filas y n columnas, y p genera los ejes de cada gráfica. Ejemplo: generar las dos gráficas anteriores por fila en una misma ventana clc t=[-2 -1 0 1 2 3 4 5 6]; m=[1.3 -1.3 1.1 -1.2 0 -0.9 1.2 1.6 1]; subplot(2,1,1) plot(t,m) 5 xlabel('t(segundos)') ylabel('m(tensión)') t=0:pi/100:2*pi; subplot(2,1,2) seno=sin(t); plot(t,seno) xlabel('t(segundos)') ylabel('m(amperios)') Los comandos axis, xlabel, ylabel etc., se digitan después del respectivo plot para colocar etiquetas. Usando el comando subplot(m,n,p), donde se genera una matriz de m filas y n columnas, y p genera los ejes de cada gráfica. Ejemplo: generar las dos gráficas anteriores por columna en una misma ventana clc t=[-2 -1 0 1 2 3 4 5 6]; m=[1.3 -1.3 1.1 -1.2 0 -0.9 1.2 1.6 1]; subplot(1,2,1) plot(t,m) xlabel('t(segundos)') ylabel('m(tensión)') t=0:pi/100:2*pi; subplot(1,2,2) seno=sin(t); plot(t,seno) xlabel('t(segundos)') ylabel('m(amperios)') 6 Con la función linspace genera n puntos entre un intervalo definido de una función Ejemplo generar la grafica de la siguiente función definida entre [-2,3]. clc x=linspace(-2,3,3000); % divide el intervalo [-2,3] en 3000 partes. y=exp(-x); % imágenes de las componentes de x plot(x,y) grid on title('función exponencial') % gráfica de la curva. 7 Existe otra forma de graficar una función en un solo paso con fplot, parcela una función entre los límites especificados. Ejemplo: fplot('exp(-x)',[-2,3]) Graficas e imágenes con Funciones a trozos Crear una imagen: para colocar una imagen en un display, se selecciona una imagen de pocos pixeles (fotografía, etc.), con extensión (TIFF, JPEG, GIF, BMP, PNG, XWD), se guarda en la carpeta de Matlab que se encuentra en mis documentos o en el escritorio se crea una carpeta y se guarda allí. Crear una función a trozos: con la función linspace, creamos una función a trozos o por partes con extensión .m y se guarda junto en carpeta donde se encuentra la imagen. Ejemplo: Diseñar un programa en Matlab que grafique la siguiente función a trozos y que muestre la siguiente imagen. clc %seleccionamos la imagen y la guardamos en una carpeta f = imread('imagenm1.png'); %luego se crea una imagen interactiva con la siguiente función g=imcrop(f); imshow(g) %y finalmente muestra la imagen %Para graficar la función a trozos, seguimos los siguientes pasos: x=linspace(-2,3,3000); % divide el intervalo [-2,3] en 3000 partes. y=(x.^2).*(x<0)+2.*((0<=x)&(x<1))+(-x+3).*(1<=x); %evalúa f usando índice lógico plot(x,y) grid on 8 Ejemplo: realizar el ejemplo anterior mostrando a través del comando subplot la ‘imagen’ y la ‘función’ ya sea por fila o por columna en un mismo display. %Colocar dos imagenes en un solo display en (2 filas, 1 columna) % Recuerda que la imagen debe ser de pocos pixeles, f = imread('imagenm1.png'); subplot(2,1,1); imshow(f); title('funcion a trozos'); %luego para graficar la función a trozos seguimos los siguientes pasos: x=linspace(-2,3,3000); % divide el intervalo [-2,3] en 3000 partes. y=(x.^2).*(x<0)+2.*((0<=x)&(x<1))+(-x+3).*(1<=x); %evalúa f usando índice lógico subplot(2,1,2) plot(x,y) title('funcion a trozos'); grid on 9 2.2 Gráficos en tres dimensiones Para construir gráficos en tres dimensiones primero se construye la superficie que representa la magnitud de una función de dos variables; las dos variables se representan en el plano horizontal y el valor de la función como una altura sobre dicho plano. La superficie se forma al unir las pequeñas rejillas implementadas alrededor de cada punto. Los comandos utilizados para graficar superficies son: mesh, meshz, meshc, surf, surfc. A través de algunos ejemplos se ilustrará la operación de los comandos y de otras utilidades adicionales. [X,Y]=meshgrid(x,y) genera una rejilla de puntos a través de los vectores X e Y. mesh(x,y,z), surf(x,y,z), para dibujar superficies en 3D. z es el valor que toma la función z=(x,y,z) en el punto de la rejilla (X,Y). Ejemplo: construir un plano en tres dimensiones con meshgrid y surf. clc x=-5:0.5:5; y=x; [x1,y1]=meshgrid(x,y); z1=0*x1; surf(z1) 10 Si deseamos agregar otro plano al mismo grafico en tres dimensiones, escribimos lo siguiente: Ejemplo: construir dos planos en tres dimensiones con surf y mesh clc x=-5:0.5:5; y=x; [x1,y1]=meshgrid(x,y); z1=0*x1; surf(z1) hold on z2=0*x1+10; mesh(z2) En la figura anterior, se observa la diferencia entre mesh y surf. El comando surf presenta dificultades cuando el número de puntos es grande; se pueden apreciar los problemas repitiendo el proceso anterior con un incremento para x1 de 0.1 en lugar del 0.5 utilizado, por lo que se recomienda utilizar preferentemente mesh. Se aprecia también que se está graficando contra el índice, para graficar directamente contra los ejes especificados debe digitarse lo siguiente: Ejemplo: Diseñar un programa en Matlab, que muestre tres planos en tres dimensiones con surf y mesh y mostrar los ejes especificados. clc x=-5:0.5:5; y=x; [x1,y1]=meshgrid(x,y); z1=0*x1; surf(x,y,z1) hold on mesh(x,y,z2) mesh(x,y,z2+10) 11 En la gráfica se observa adicionalmente todos los ejes especificados axis([-5 5 -5 5 0 30]). Ejemplo: Diseñar un programa en Matlab que generar un plano en tres dimensiones con ejes y curvar su altura a través de una función. clc x=-5:.5:5; y=x; [x1,y1]=meshgrid(x,y); z4=1./(x1.^2+1); mesh(x,y,z4) Ejemplo: Diseñar un programa en Matlab que grafique en tres dimensiones la siguiente función con los siguiente limites: -8:0.5:8. sin( r ) / r , donde r u 2 v 2 Utilizando el comando mesh, y para evitar dividir por cero, se utiliza el comando eps que es un espaciamiento de números de punto flotante, y permite hacer divisiones por valores de casi cero sin que entre en un ciclo infinito la función. 12 clc u=-8:0.5:8; v=u; [U,V]=meshgrid(u,v); R=sqrt(U.^2+V.^2)+eps; W=sin(R)./R; mesh(W) Otra forma de generar gráficos en tres dimensiones es con la función plot3(x,y,z), donde se tienen los vectores x, y y z, entonces para generar la gráfica solo es necesario teclear el punto de coordenadas cartesianas y luego los enlaza por segmentos para generarlo en 3-D. Ejemplo: Diseñar un programa en Matlab, que genere una gráfica tridimensional de una helicoidal con la función plot3. clc t = 0:pi/50:10*pi; plot3(sin(t),cos(t),t) axis square; grid on El comando axis permite fijar los límites de los ejes en una gráfica y la opción square fija las coordenadas iguales en los tres ejes. En la siguiente figura se muestra la gráfica resultante. 13 TALLER No.2 PARA RESOLVER EN MATLAB Realizar los siguientes ejercicios: Gráficos en dos dimensiones 1) Graficar una función diente de sierra uniforme y superponerle las funciones seno y coseno y colocarles etiquetas (title, xlabel, ylabel) 2) Obtener 4 gráficas en un mismo display y colocarle etiquetas (title, xlabel, ylabel). A- Primero mostrar las graficas por filas. B- Segundo mostrar las graficas por columnas de: - una función diente de sierra uniforme - una función tangente - una función constante - pendiente positiva 3) Ejercicio: diseñar un programa en Matlab que grafique dos funciones a trozos en un mismo display, y que además muestre los gráficos de los tramos de las funciones literalmente, utilizando los comandos subplot y con subtitulos (title, xlabel, ylabel), las siguientes dos funciones a trozos. Gráficos en tres dimensiones 1. Graficar 5 planos en tres dimensiones 2. Disenar un programa en Matlab que grafique la siguiente función en tres dimensiones utilizando el comando mesh. cos(k ) / k , donde k x2 y2 3. Utilizando el comando plot3, diseñar programa en Matlab de un grafico en 3D con una función seno, una función coseno y una función constante y generar con estas tres funciones un círculo en tres dimensiones. 4. De acuerdo a 3) Cómo se grafica un óvalo en tres dimensiones 14