Mostrando entradas con la etiqueta gráficas. Mostrar todas las entradas
Mostrando entradas con la etiqueta gráficas. Mostrar todas las entradas

Cómo hacer el símbolo del pentagrama con Matlab



Resumen
Un pentagrama es una estrella de cinco picos, hecha con cinco trazos. Tiene propiedades geométricas muy interesantes.

Para construirla, aquí dibujamos una linea horizontal, y la giramos mediante la función rot2d, cuyo al código encontraras al final de esta entrada. El guión del pentagrama se basa en dibujar una linea horizontal y luego rotarla. Sin embargo, se tiene cuidado de usar adecuadamente las definiciones de operaciones de matrices para obtener los vectores rotados.

Preguntas para pensar
1) ¿En que situaciones Matlab es una herramienta cómoda y adecuada para dibujar?, ¿y en situaciones Matlab es una pesima herramienta para hacer dibujos?
2) ¿Mejorando el entorno gráfico de Matlab, hace más amigable sus funciones de dibujo?

Ejercicios
1) Dibuje una estrella de David, utilizando de base los códigos de esta entrada
2) Explique con un ejemplo la importancia de de usar x = [x x(1)]; para obtener una rotación adecuada.
3) ¿En que coordenadas el punto en que gira la linea horizontal?, ¿Cómo puede especificar otro punto como pivote de los giros?

Códigos Matlab 
function [xt, yt] = rot2d(t, x, y)
% La función  rot2d rota un objeto bidimensional 
% que es representado por dos vectores: X y Y
% El ángulo de rotación es t, en radianes. 
r = [cos(t) -sin(t); sin(t) cos(t)];
x = [x x(1)];
y = [y y(1)];
z = r*[x;y];
xt = z(1,:);
 yt = z(2,:);

%guión para dibujar el pentagrama
%% Pentagrama 
%  Author: Vicente Torres Zuñiga 
%  
% Guión Matlab para graficar el símbolo de un pentagrama en el sistema 
% cartesiano
% El símbolo consiste en un círculo con un pentagrama en interior -un 
% estrella de cinco puntas dibujada con cinco lineas % 
%
% El algoritmo se enfoca en obtener las coordenadas de dibujo:
% primero de un circulo, luego de una linea horizontal, que posteriormente
% se rota para generar cuatro lineas para completar el pentagrama
%
close all; clear; clc % limpiamos la casa
num_puntos = 250; % número de puntos
t = linspace(0, 2*pi, num_puntos); % Intervalo
noLados = 5; % Número de lados del polígono
AnguloInt = 2*pi/noLados; % Ángulo interior del polígono
%
% Variables del círculo 
r = 2; % Radio
h = 0; k = 0; % Coordenadas del centro
%
% Ecuación parámetrica del círculo:
x = r*cos(t)+h; y = r*sin(t)+k; 
%
%% Ecuaciones para la linea horizontal
% Longitud de la linea horizontal
lH = 2*r*sin(AnguloInt);
% Distancia de la linea horizontal al centro: (0,0)
dist_lH = r*cos(AnguloInt);
%
% Definición del intervalo de la línea horizontal
xH = linspace(-lH/2, lH/2, num_puntos);
% Definición de vectores
L = zeros(2,num_puntos);
L(1,:) = xH;
L(2,:) = -dist_lH;
%
[L0rx  L0ry] = rot2d(AnguloInt*0, L(1,:), L(2,:));
[L1rx  L1ry] = rot2d(AnguloInt, L(1,:), L(2,:));
[L2rx  L2ry] = rot2d(AnguloInt*2, L(1,:), L(2,:));
[L3rx  L3ry] = rot2d(AnguloInt*3, L(1,:), L(2,:));
[L4rx  L4ry] = rot2d(AnguloInt*4, L(1,:), L(2,:));
%
% Gráficas
hold on
plot(x,y, 'r', 'LineWidth', 4) % círculo 
plot(L0rx, L0ry, 'LineWidth', 4)  % línea horizontal
plot(L1rx, L1ry, 'LineWidth', 4)
plot(L2rx, L2ry, 'LineWidth', 4)
plot(L3rx, L3ry, 'LineWidth', 4)
plot(L4rx, L4ry, 'LineWidth', 4)
axis square off
hold off
% fin del guión/script

Cómo transformar una figura de Matlab en una imagen portable.




Resumen
En esta ocasión se muestran las bases para que nuestras figuras en Matlab se exporten como archivos de imagen y se puedan incorporar en un procesador de textos.
Básicamente, existen cuatro caminos para exportar:

1) El copy-page; en la barra de menús de la imagen, damos clic en Edit y luego en Copy figure. Ya después podemos pegar nuestra información en otro programa, tal vez powerpoint.

2) Salvar como. Utilizando la interface gráfica de la figura Matlab, podemos cómodamente salvar nuestra figura en diversos formatos de imagen (png, pdf, jpg, etc.). Únicamente hay que seguir las instrucciones

3) Uso del comando print. Este comando es muy versátil y permite guarda las imágenes en varios formatos, controlar la calidad de pdi de la imagen e incluso automatizar el proceso de guardar-nombrar archivos. Además de ser el de mayor calidad. Mejor aún, utilizando previamente los comandos:

Set(gcf, ‘InvertHardcopy’, ‘off’)

Así, se preserva el color del fondo que nosotros escogimos previamente para la figura.

4) Impresión de pantalla. En el video omitimos esta opción para salvar las imágenes, pues no es propio de Matlab. El botón de ImprPant es muy general y depende de la resolución de tu monitor, suele mostrar elementos innecesarios que se deberían de corregir en un programa que manipule imágenes. Cuando se trabaja con muchas imágenes y se busca la mejor calidad, este camino se debe evitar

Contar con gráficas de alta calidad visual y de datos es vital para que nuestra publicación, tesis o trabajo escolar sea aprobado por los revisores; por ello no se debe descuidar la presentación de nuestras imágenes.

Preguntas para pensar
1) ¿Qué determina que la imagen sea de alta calidad?
2) ¿Por qué usar 300 dpi en esta clase de imágenes?, ¿Siempre es así?

Ejercicios
1) Introduzca en un ciclo for el comando print, de modo que obtenga 10 imágenes secuenciadas de una senoidal a la que se le varia la frecuencia o la amplitud.

Juntas, pero no revueltas: sub-gráficas en una misma figura de Matlab

Ejemplo del uso de subplot
El comando de Matlab subplot es lo suficientemente versátil para darle sendos ejes y características adicionales a las gráficas que coloquemos en una misma imagen.

Efectivamente, basta con indicar como se compondrá la matriz de la imagen (a,b) y que espacio p ocupará cada una de las gráficas; es decir, subplot (m, n, p) hace la división del espacio de la figura. Matlab asignara el espacio con en paneles regulares para cada gráfica. Este es un ejemplo simple de una rutina aplicada una figura compuesta de 2 gráficas.

Asignación simple de paneles
x= 1:0.1:2*pi;
subplot(2,1,1), plot(x)
subplot(2,1,2), plot(sin(x))

En general, el comando subplot brinda una figura de configuración simétrica de paneles, que son donde se colocan las gráficas. Y cada panel es independiente de los otros. Sin embargo, si el parámetro p es una matriz, entonces se puede ocupar más de un panel para una gráfica. Por tanto, en una misma figura se puede colocar una gráfica grande y otras más pequeñas. Por ejemplo usando el siguiente código:


Asignación asimétrica de paneles
x= 1:0.1:2*pi;
subplot(2,2,[1 2]); plot(sin(x))
subplot(2,2,3); plot(log(x))
subplot(2,2,4); plot(exp(x))

Finalmente, hay que destacar que se puede utilizar el subplot dentro de ciclos de programación, de forma que se pueden automatizar colecciones de imágenes que siguen una línea de historica. Por ejemplo:




Ejemplo del uso de  subplot
en un ciclo for
y = zeros(4,15); % se inicializa un vector, para ser más eficiente
for k = 1:4 % seran cuatro colecciones de datos
y(k,:) = rand(1,15); % se crea un vector de 15 elementos aleatorios
subplot(2, 2, k) % el índice se usa para dar orden a la secuencia de gráficas
plot(y(k,:)); % se hace la gráfica
end

Precauciones
Utilizando scripts, solamente se pueden crear estas gráficas cuando ya se cuenta con la matriz completa. En otro caso hay que utilizar comandos como drawnow, del que ya anteriormente hemos mostrado unos ejemplos.

Preguntas para pensar
1) Describa un ejemplo especifico donde los subplot en un ciclo for son aplicados


Ejercicios
1) Obtenga la siguiente imagen utilizando diferentes comandos de Matlab

Ejercicio de esta entrada

Dibujando gráficas como si fueran animaciones en Matlab

Manos dibujando
Matlab permite fácilmente crear gráficas; pero ¿qué pasa cuando queremos hacer una animación de esa gráfica? Por ejemplo, ir presentado cómo se produce la trayectoria de un cuerpo en movimiento. Con animaciones esta tipo de gráficas son espectaculares en cualquier presentación. En una entrada anterior trate un poco sobre este tema utilizando fotogramas.

Aquí, presentare ejemplos donde no se crea video.

Ingenuamente podemos usar un código simple, como el siguiente.

figure(1);
for i=1:1000
T(i)=cos(i);
plot(T);
end

Efectivamente, aunque no aprovechamos la ventaja de la preasginación de memoria, la idea es que no es importante la velocidad del cálculo, sino que se cuente con la construcción dinámica de la curva; por ello, el comando plot tiene ir dentro del ciclo for.

Sin embargo, hasta este punto, el código es inútil. Pues la reserva de memoria de los cálculos es independiente y asíncrona de la memoria gráfica. Es decir la gráfica se producirá cuando se cuente con el vector completo.  La solución es insertar un comando que actualice todas las ventanas ese comando es drawnow.

Con todo, nuestro código se puede estar ejecutando muy rápido; por lo que hay que añadir dentro del código una pausa (comando pause) al que se le puede controlar el tiempo de ejecución. Digamos que esperamos .3 segundos por iteración. De tal modo que nos da bastante tiempo para ver con comodidad los resultados, pero esto es útil cuando los cálculos son pocos.

Mi ejemplo de código entonces es:

figure(1);
for i=1:1000
T(i)=cos(i);
plot(T);
drawnow;
pause(0.3)
end

El factor comet

El comando comet es otra opción para darle movimiento a la construcción de nuestras gráficas. Sin embargo, para pocos puntos su ejecución es demasiado rápida para apreciarse. Por lo cual se requieren muchos puntos para poder apreciar la construcción. Una alternativa es disminuir el paso entre punto y punto o aumentar el intervalo del vector a graficar. Lamentablemente, este comando no tiene una opción para controlar la velocidad, y aunque se puede alterar el código original para cambiar la velocidad, no es muy recomendable si estas iniciando el arte de hacer código para Matlab.

Pero si sientes que tu experiencia es suficiente para hacerlo, pues te recomiendo ir a los foros del mismo Matlab Central donde te puedes dar una idea de cómo hacer tal alteración: foro1, foro2


El siguiente video te muestra el código y los resultados que obtengo.



Preguntas para pensar 

1) Sin que se cree un video en que casos particulares es más útil esta opción que la de crear un video en Matlab. Revisa nuestra entrada anterior  sobre la  creación de animaciones.

Ejercicios

1)  Realiza una rutina donde se pueda visualizar al mismo tiempo varias gráfica en un una sola ventana, puedes usar el comando subplot

2) Aplica esta solución para ver la dinámica una gráfica de tres variables (X,Y,Z) que cambia con el tiempo.

Cómo poner un cross-hair (cursor de línea) en las figuras de Matlab

Gráfica con tres cursores de linea
Cuando requerimos explorar una gráfica es una gran ayuda contar con un cursor de línea (cross-hair) vertical o horizontal.
graphics.cursorbar, que es un objeto interno de Matlab, es una solución para tener tal aditamento en nuestras gráficas.

Se inicializa el graphics.cursorbar al sustituir un eje (lo que no es muy útil), o graficando una línea (que es más inteligente). Este objeto se puede personalizar utilizando propiedades como BottomMarker, TopMarker, CursorLineColor, CursorLineStyle, CursorLineWidth, TargetMarkerSize, TargetMarkerStyle, ShowText, Orientation, Position (la cual es una propiedad oculta), entre otras.

Ahh!, por supuesto, también están presentes las propiedades regulares (UserData, Visibility, Parent etc.).
Una vez que el cursor de línea es creado, este puede ser movido por medio del cursor del raton, como el código muestra:

%%%% inicia código
x=0:.01:7; y=plot(x,sin(x));
hCursorbar = graphics.cursorbar(y); drawnow
hCursorbar.CursorLineColor = [1,.2,.3]; % default=[0,0,0]='k'
hCursorbar.CursorLineStyle = ':'; % default='-'
hCursorbar.CursorLineWidth = 1; % default=1
hCursorbar.Orientation = 'vertical'; % =default
hCursorbar.TargetMarkerSize = 10; % default=8
hCursorbar.TargetMarkerStyle = 'o'; % default='s' (square)
%%%% fin del código

Ahora bien, en muchas gráficas se puede desear tener dos o más cursores de línea. Por ejemplo una horizontal y otra vertical (x,y), o bien dos verticales (x_1, x_2); esto se puede hacer en base del sig. código:

x=0:.01:7; y=plot(x,sin(x));
hCursorbar1 = graphics.cursorbar(y);
hCursorbar2 = graphics.cursorbar(y);
% ahora a personalizar la apariencia de hCursorbar1 y a hCursorbar2

Preguntas para pensar
1) Menciona dos aplicaciones especificas y concetras donde es importante tener esta aditamento gráfico


Ejercicios
3) Crea un imagen con dos subgráficas donde esten contenidas dos sendos cursores en linea. Es decir en total tendremos cuatro cursores de linea.
4) En una interface de usuario con gráfica introduce estos cursores de linea.

Cómo hacer un diagrama de barras estadístico con Matlab

Existen varias posibilidades para representar diagramas de barras. Por ejemplo, los datos se escriben como un vector y son introducidos a Matlab:

>> x = [10 2 3 4 18 20 15];

Entonces, podemos usar los comandos bar, barh, bar3 y bar3h para generar los gráficos. Usamos como apoyo el comando subplot para ver en una sola imagen todos estos resultados.

>> subplot(2,2,1), bar(x), title('Barras verticales')
>> subplot(2,2,2), barh(x), title('Barras horizontales')
>> subplot(2,2,3), bar3(x), title('Barras verticales 3D')
>> subplot(2,2,4), bar3h(x), title('Barras horizontales 3D')

El resultado lo podemos ver en la siguiente figura:

Diagrama de barras

Por supuesto,  las graficas 3D se pueden modificar empleando el comando rotate3d.

Además, los datos pueden estar agrupados. Como ejemplo, consideremos los siguientes datos

x = [1 2 3; 4 3 6; 10 9 8; 4 2 7; 12 10 7 ];

Utilizando los mismos comandos que antes, con modificaciones como: bar3(x,'group') y bar3(x,'steack'). Obtenemos la siguiente figura.

Diagrama de barras apiladas y agrupados 3D

Preguntas para pensar.

En que casos prácticos son útiles matrices de MxN mostradas como diagrama de barras.

Ejercicios:

Empleando la función rand genere un vector de 1000 datos,  agrupe los valores entre 0-10, 10-20, 20-30 y así.  ahora haga el diagrama de barraras con la agrupación, por lo que solo aparecernos 10 barras.

Ejemplos de código para formar señales discretas en Matlab

El objeto más básico en Matlab es una matriz numérica con la posibilidad de almacenar números complejos. Por supuesto, los datos obtenidos en el estudio de señales y sistemas son muy bien representados en forma de matrices. En este post usaremos Matlab para la generación de señales elementales: cuadrada, triangular, entre otras.

El ToolBox de procesamiento de señales de Matlab posee una gran variedad de funciones para la generación de señales, estas señales requieren de una representación vectorial de la variable tiempo, de manera continua o discreta. Para realizar una simulación de un intervalo continuo, se usa un vector de valores discretos con un intervalo de muestreo muy pequeño.

Como vimos en post anteriores, el siguiente comando genera un vector llamado t de valores que representan la variable tiempo, con un intervalo de muestreo de 1 ms entre 0 y 1 segundo.

t = 0:0.001:1;

Después de creado el vector que representa la variable tiempo, es posible iniciar el desarrollo de alguna señal de interés.

En Matlab una señal discreta en el tiempo se representa exactamente, porque los valores de la señal son representados como los elementos de un vector. Sin embargo las señales de tiempo continuo en Matlab son tan solo aproximaciones. La aproximación consiste de un vector cuyos elementos son muestras de la verdadera señal de tiempo continuo. Cuando se usa esta técnica para la representación de señales continuas es importante escoger el intervalo de muestreo lo suficientemente pequeño para asegurar que las muestras capturan todos los detalles de la señal.

EJEMPLOS DE SEÑALES EN MATLAB 

La generación de señales periódicas tales como ondas cuadradas y triangulares es una actividad muy fácil de realizar en MATLAB.

1) SEÑAL CUADRADA
Consideremos primero la generación de una onda cuadrada de amplitud A, frecuencia fundamental w (medida en radianes por segundo) y ciclo útil rho. Recordemos que el ciclo útil es la fracción de cada periodo en donde la señal es positiva.


Para generar dicha señal se pueden escribir lo siguiente en la linea de comandos:


>> A = 1;
>> w = 10 * pi;
>> rho = 0.5;
>> t = 0:0.001:1;
>> sq = A*square(w*t+rho);
>> plot(t,sq);

En la segunda línea de este ejemplo, pi es una función interna de Matlab que calcula el número más cercano a la constante PI en formato de coma flotante. El último comando es usado para vizualizar la señal generada. El comando plot dibuja líneas conectando los valores sucesivos de la señal y así da la apariencia de una señal en tiempo continuo.

2) SEÑAL TRINGULAR 

Consideremos ahora la generación de una onda triangular de amplitud A, frecuencia fundamental w y ancho Wdt . El periodo de la onda triangular será T con el máximo valor de la señal ocurriendo en t = WT . El comando básico para generar esta señal es:

A * sawtooth(w * t + Wdt)

El resultado se puede observar en la gráfica a la izquierda


3) SEÑAL ESCALÓN

En Matlab, el comando ones(M, N) genera una matriz de unos de tamaño MxN, y el comando zeros(M, N) es una matriz de ceros del mismo tamaño. Se puede hacer uso de estas dos matrices para generar dos señales comúnmente usadas: la señal escalón y la señal impulso.

Una señal paso de amplitud uno, puede ser generada con el siguiente comando.


U = [zeros(1, 10), ones(1, 11)];


Para la versión continua creamos un vector que represente el tiempo el cual tenga muestras de un intervalo separados por valores muy pequeños. Los comandos y los resultados se muestran a continuación:

>> u=[zeros(1,10),ones(1,11);
>> t=-1:0.1:1;
>> plot(t,u)


Como se menciono anteriormente, una señal generada en Matlab es inherentemente de naturaleza discreta. Para visualizar una señal en tiempo discreto se puede hacer uso del comando stem. Específicamente stem(n, x), bosqueja los datos contenidos en el vector x como una señal de tiempo discreto con los valores de tiempo definidos por el vector n. Los vectores n y x deben tener dimensiones compatibles, es decir deben tener el mismo número de elementos. Así, para este caso para obtener la representación de esta señal en tiempo discreto creamos un vector-tiempo el cual debe tener valores separados por una unidad.

>> u=[zeros(1,10), ones(1,11)];
>> n=-10:10;
>> stem(n,u)

Recuerde que para poder usar las funciones plot y stem, es requisito que los vectores (t y u) ó (n y u) tengan iguales dimensiones. Por esta razón el vector u se forma como una composición de diez ceros y 11 unos, debido a que los arreglos t y n, tienen dimensión 21 dado que incluyen un elemento central el cual es el número cero. Para probar este hecho, se puede hacer uso de la función Matlab llamada size que devuelve como resultado un vector con las dimensiones de la matriz que se le pasa como parámetro.

4) SEÑAL IMPULSO:


La versión discreta de la señal impulso se puede también generar con ayuda de las funciones zeros y ones, realizando una composición como sigue:


>> delta = [ zeros( 1 ,10 ), 1 , zeros( 1 ,10 ) ];
>> n = -10:10;
>> stem(n,delta);



5) SEÑAL RAMPA 

Para generar la señal rampa, tan solo es necesario recordar que esta función puede ser creada, como la composición de una recta Y(x) = x a partir de cero y de la recta Y(x) = 0 para valores de x menores de cero, así la versión discreta se muestra a continuación:


>> t1=0:0.1:10;
>> rampa1=t1;
>> rampa=[zeros(1,101),rampa1];
>> t2=-10:0.1:0;
>> t=[t2,t1];
>> plot(t,rampa)

Ejercicios:

1) Desarrollar un conjunto de comandos Matlab para aproximar las siguientes señales periódicas en tiempo continuo, dibujando 5 ciclos de cada una:

a) Onda Cuadrada, de amplitud 5 Volts, frecuencia fundamental 20 Hz y ciclo útil del 60%.

b) Señal diente de sierra, amplitud 5 Volts y frecuencia fundamental 20Hz
Related Posts Plugin for WordPress, Blogger...