Guía de Matlab
con aplicaciones al Curriculum de
Ingeniería Civil Informática
Índice
OBJETIVOS DE LA GUÍA Y A QUIEN ESTA DIRIGIDA. 3
INTRODUCCIÓN. 4
PARTE 1 APLICACIONES SIMPLES PARA PRIMER AÑO. 7
1.1 Entorno de Trabajo 7
1.2 Creación de Variables 8
1.3 Creación de Funciones 10
1.4 Creación de Gráficas 11
1.5 Generalidades del comando plot 14
1.6 Editor de MATLAB 16
1.7Programación en MATLAB 19
PARTE 2 APLICACIONES PARA ANÁLISIS DE SEÑALES. 22
Aplicación 1 Armónicos de una señal cuadrada 22
Aplicación 2 Gráfica de sinusoidales y análisis en frecuencia 23
Aplicación 3 Gráfica de sinusoidales utilizando Simulink 25
Aplicación 4 Manejo de Audio 26
PARTE 3 APLICACIONES PARA INTELIGENCIA ARTIFICIAL 28
1. Redes Neuronales 28
Objetivos de la guía y a quien esta dirigida.
El uso de herramientas de modelamiento y análisis son fundamentales en el diseño y prueba de prototipos, tanto a nivel de software como hardware. En la formación de un Ingeniero Civil Informático, la posibilidad de contar con un laboratorio virtual en términos de poner en práctica sus diseños y modelos es fundamental, así también como contar con un entorno gráfico de enseñanza, es una gran oportunidad en el mejoramiento de los aprendizajes, tanto por el hecho de mejorar el factor motivacional de los estudiantes, así como también para mejorar sus resultados incorporando métodos innovadores que permitan trabajos colaborativos, desarrollo de proyectos, resolución de problemas, etc.
Nuestra Escuela de Ingeniería Civil Informática, posee hace varios años la licencia para educación del software Matlab, plataforma que en los últimos años ha sido incorporada como herramienta de aprendizaje de varios ramos y al no contar con literatura al respecto es que nace la motivación de crear esta guía inicial, la cual puede en el futuro seguirse adaptando al curriculum particular de nuestra carrera, invitando a los estudiantes a incorporar la herramienta como un buen recurso para el aprendizaje. Actualmente se esta realizando la compra de bibliografía que potencie el uso de la herramienta, pero de todas formas, esta guía se adapta a las necesidades de un curriculum específico.
La primera parte de esta guía esta focalizada a los estudiantes de primer año, en el contexto del ramo de Introducción a la Ingeniería (ICI-114), donde se familiarizan con el entorno, y desarrollan aplicaciones que tienen relación con los ramos de Algebra (ICI-112) e Introducción a la Computación (ICI113). La segunda parte tiene relación con el procesamiento de señales, que permitirá incluir la herramienta en ramos tales como Transmisión de Datos (ICI-222) y Circuitos Digitales (ICI-511). Finalmente la última parte presenta aplicaciones sustentadas teóricamente con el ramo de Inteligencia Artificial (ICI-612), ramo donde se comenzó a trabajar con la plataforma Matlab desde el año 2005.
Es importante mencionar que este es una primera aproximación y queda como desafío mejorar dicha guía, especialmente con la interacción directa de Ciencias Básicas para incorporar herramientas de simulación en los procesos de enseñanza-aprendizaje.
Introducción.
Existe en el mercado una amplia gama de recursos de software para el diseño, programación y simulación. Entre estos existen dos particularmente muy similares que se diferencian por ser uno de distribución libre (licencia gratuita) y el otro propietario. Nos referimos a Octave y Matlab respectivamente.
El software libre llamado OCTAVE1 que posee un entorno muy similar a Matlab, y que permite el mismo tipo de programación así como también acepta los códigos realizados sobre Matlab.
Figura 3 Octave
La plataforma Matlab2 propiedad de Mathworks® puede ser definido (según sus fabricantes) como un lenguaje de alto nivel y un entorno interactivo que permite realizar tareas de cálculo complejas de forma más rápida que con los lenguajes de programación tradicionales, como C, C++ y Fortran. Su nombre proviene de la reducción de Matrix Laboratory (laboratorio de matrices).
Figura 1 Matlab
1
Octave http://www.gnu.org/software/octave/
Posee además una variedad muy amplia de Toolbox que proveen funcionalidades en áreas específicas tales como:
• Optimización y Matemática
Optimization Toolbox Symbolic Math Toolbox
Partial Differential Equation Toolbox
Genetic Algorithm and Direct Search Toolbox
• Análisis de datos y Estadística
Statistics Toolbox Neural Network Toolbox Curve Fitting Toolbox Spline Toolbox Model-Based Calibration Toolbox
• Análisis y Diseño de Sistemas de Control
Control System Toolbox System Identification Toolbox
Fuzzy Logic Toolbox Robust Control Toolbox Model Predictive Control Toolbox
Aerospace Toolbox
• Comunicaciones y Procesamiento de Señales
Signal Processing Toolbox Communications Toolbox Filter Design Toolbox
Filter Design HDL Coder Wavelet Toolbox Fixed-Point Toolbox RF Toolbox
• Procesamiento de Imagenes
Image Processing Toolbox Image Acquisition Toolbox Mapping Toolbox
• Medición y Prueba
Data Acquisition Toolbox Instrument Control Toolbox Image Acquisition Toolbox SystemTest OPC Toolbox
Parte 1 Aplicaciones simples para primer año.
Esta primera parte entrega nociones básicas de cómo interactuar con Matlab por primera vez, y elementos básicos del entorno, datos y gráficas. Se aconseja que si no se ha trabajado previamente con Matlab, se realicen al menos las primeras actividades de esta guía de todas formas.
La idea es que al finalizar esta primera parte, el estudiante sea capaz de realizar gráficos simples en 2D utilizando Matlab utilizando los comandos que sean pertinentes.
1.1 Entorno de Trabajo
Una vez abierto Matlab, se debe trabajar en la ventana de comandos (Command Windows), como se indica en la figura siguiente, identificando las ventanas de:
• Workspace, espacio de trabajo donde se visualizan las variables que existen. • Command History, historial de commandos ejecutados.
• Command Windows, ventana donde se ejecutan los commandos.
En caso de no tener esta vista podemos ir al menú de vistas y elegir el escritorio por defecto (View - Desktop Layout – Default).
COMMAND WINDOW VENTANA
WORSPACE
La manera en que se usa la ventana de comandos en Matlab es similar a la consola de cualquier Sistema Operativo, tan solo se requiere conocer los comandos y su sintaxis respectiva. A tener en cuenta:
• “%” todo lo que se escribe después del signo de porcentaje es llamado
comentario (%este es un comentario).
• Los comandos se pueden escribir cada uno por línea, o en una sola línea
separados por una coma (>> x=4, y=5, z=9)
• Los comandos pueden ser escritos con un “;” (punto y coma) al final o no, la
diferencia en es que al no finalizar con “;” se produce un eco de dicho comando en la misma ventana de comandos.
Para comenzar se muestran una serie de comandos básicos con su debida explicación que podrían usarse en matemática básica.
Comandos Uso Detalle
help >>help Aparece la ventana de ayuda demos >>demos Aparecen ejemplos
sqrt >>sqrt(A) Raíz cuadrada de A
roots >>roots(P(x)) Halla las raíces del polinomio P(x) abs >>abs(A) Valor absoluto de A
log >>log(A) Logaritmo natural de A log10 >>log10(A) Logaritmo base 10 de A clear >>clear A Borra la variable A
plop >>plop(a,b) Grafica los pares ordenados (a,b) Axis >>axis(opcion) Opciones del escalado del grafico figure >>figure(gcf) Llama al grafico al frente
Clc >>clc Borra la pantalla de comandos
1.2 Creación de Variables
La forma básica de crear una variable unidimensional es:
>>x=5, y=6
Luego si queremos operar con dichas variables tenemos el siguiente ejemplo de suma de dos variables,
>>z=x+y
Lo que desplegará en pantalla el resultado de z que será 11, donde al mismo tiempo se ha creado una nueva variable llamada z.
>>x=[1 2 3] %Crear un vector x con los valores 1, 2 y 3
>>y=[log(6) sqrt(4) 8]
Los dos vectores creados anteriormente poseen 1 fila y 3 columnas.
Otra forma de crear vectores es,
>>x=(a,b) Crea un vector que aumenta de 1 en 1, desde a hasta b. >>x=(a:c:b) Crea un vector que aumenta de c en c, desde a hasta b.
Por ejemplo,
>>x=(1:5) Genera un vector con los valores: 1, 2, 3, 4, 5 >>x=(1:3:9) Genera un vector x con los valores: 1, 4, 7
Para crear una matriz de tamaño 3x3 se tiene como ejemplo, >> y=[1 2 3;4 5 6;7 8 9];
Donde cada fila esta separada por un punto y coma.
Otros ejemplo utilizando el comando de generación de números randómicos rand(),
>> A=rand(6), B=inv(A), B*A ; % vea la estructura de cada variable
La coma significa otras sentencias, es decir seria lo mismo que
>> A=rand(6) >> B=inv(A) >> B*A
A parte de definir un vector introduciendo cada uno de sus elementos, también podemos crearlo haciendo uso de las siguientes sentencias:
• (a:b) crea un vector que comienza en el valor a y acaba en el valor b
aumentando de 1 en 1.
• (a:c:b) crea un vector que comienza en el valor a y acaba en el valor b
aumentando de c en c.
• linspace (a,b,c) genera un vector linealmente espaciado entre los valores a y
b con c elementos.
• linspace (a,b) genera un vector linealmente espaciado entre los valores a y b
con 100 elementos.
• logspace (a,b,c) genera un vector logarítmicamente espaciado entre los
valores 10^a y 10^b con c elementos.
• logspace (a,b) genera un vector logarítmicamente espaciado entre los valores
Ejemplos varios,
>> (1:7) % crea un vector que comienza en 1, aumenta de 1 en 1 y acaba en 7 ans =
1 2 3 4 5 6 7
>> (1:3:10) % crea un vector que comenzando en 1, aumenta de 3 en 3 hasta el 10 ans =
1 4 7 10
>> (1:4:10) % comenzando en 1, aumenta de 4 en 4 hasta el 10 y por eso acaba en 9 ans =
1 5 9
>> (50:-7:1) % crea un vector que comenzando en 50, disminuye de 7 en 7 hasta el 1 ans =
50 43 36 29 22 15 8 1
>> linspace (2,6,3) % genera un vector desde el 2 al 6 con 3 elementos equidistantes ans =
2 4 6
>> linspace (2,6,4) % genera un vector desde el 2 al 6 con 4 elementos equidistantes ans =
2.0000 3.3333 4.6667 6.0000
>> logspace (0,2,4) % genera un vector logarítmicamente espaciado entre 10^0 y 10^2 con 4 elementos
ans =
1.0000 4.6416 21.5443 100.0000
Por otra parte, si se necesita cambiar el valor de una variable basta con re-asignarla, como se indica a continuación
>> x=18 % x vale 18
>> x=(1:1:10) % x ahora es un vector de 10 elementos
Finalmente si se requiere borrar una variable, se utiliza el comando clear
>>clear x
Y la variable x será borrada.
1.3 Creación de Funciones
Es posible crear vectores que representen los valores de una función en el plano cartesiano. Se requiere un vector para almacenar los valores del eje de las abscisas y otro para el eje de las ordenadas.
Ejemplo Línea Recta
Para conseguir los valores en el eje de las abscisas hacemos lo siguiente:
>>x=(0:1:10)
Posteriormente es necesario tener valores para el eje de las ordenadas. Y para ello procedemos a utilizar una ecuación lineal:
>>y=x+3 >>z=x+5
Así creamos las variables ‘y’ y ‘z’ las cuales tomarán los valores respectivos según la ecuación asociada.
Ejemplo Función Seno
Veamos cómo se puede representar la función seno entre 0 y 10. Para empezar se crea un vector X de 0 a10 con una distancia de 0.01:
» x=0:0.1:10;
A continuación, calculemos sin(x) almacenando el resultado en la variable y:
» y=sin(x);
Ejemplo Parábola
Crearemos la variable x que será un vector de 2501 elementos don el menor es -10 avanzando en 0.01 en 0.01 hasta llegar a 15
>>x=-10:0.01:15;
Después creamos la función y(x) que tendrá la forma de una ecuación cuadrática
>>y=x.^2 - 5*x - 10; % x.^2 Significa x al cuadrado
1.4 Creación de Gráficas
El comando plot nos permite graficar en 2 dimensiones. Una forma de hacerlo es haber creado previamente los datos correspondiente al eje de las abscisas y las ordenadas, es decir, x e y. La sintaxis es como se indica,
A continuación se mostrarán varios ejemplos,
Ejemplo línea recta
Para conseguir los valores en el eje de las abscisas y las ordenadas hacemos lo siguiente:
>>x=(0:1:10) >>y=x+3
Y para obtener la gráfica siguiente se tiene, >>plot(x,y)
0 1 2 3 4 5 6 7 8 9 10 3
4 5 6 7 8 9 10 11 12 13
También se puede mostrar la traza de varias funciones que dependan de una misma variable, esto es:
>>x=[1 2 3 4 5 6 7 8 9 10] >>y=x+3
>>z=x+5 >>plot(x,y,x,z)
Y se observa a continuación el resultado,
1 2 3 4 5 6 7 8 9 10 4
Ejemplo parábola
Al igual como se explicó anteriormente primero se crean los vectores,
>>x=-10:0.01:15;
>>y=x.^2 - 5*x - 10; % x.^2 Significa x al cuadrado >>plot(x,y)
-10 -5 0 5 10 15
-20 0 20 40 60 80 100 120 140
Ejemplo Sinusoide
Como se explico anteriormente se crearan los respectivos vectores x e y según, >> x=0:0.1:10;
>> y=sin(x); >> plot(x,y);
0 1 2 3 4 5 6 7 8 9 10
1.5 Generalidades del comando plot
El comando plot tiene una gran cantidad de parámetros adicionales que sirven para personalizar el grafico. De esta manera el comando plot se puede escribir:
>>plot(x,y,’parámetros’)
En donde los parámetros pueden ser:
Ejemplo:
>>plot(x,y,’-rs’, ‘LineWidth’,2)
En donde ‘-rs’ quiere decir que son líneas continuas de color rojo y de marcas cuadradas.
El ‘LineWidth’,2 da la posibilidad de regular el grosor de la línea, siendo el tamaño en esta ocasión igual a 2.
También se le puede dar el nombre al gráfico escribiendo:
>>plot(x,y),title('Grafica de una Función Lineal') %todo junto
Si queremos podemos cambiar los ejes con la función Axis.
MATLAB ajusta la escala de cada uno de los ejes de modo que varíe entre el mínimo y el máximo valor de los vectores a representar.
axis([xmin, xmax, ymin, ymax])
Mientras que:
• axis('auto') devuelve el escalado de los ejes al valor por defecto o automático.
Otros posibles usos de este comando son los siguientes:
• axis('equal') el escalado es igual en ambos ejes
• axis('square') la ventana será cuadrada
• Entre otros
Ejemplos,
Si queremos que los ejes empiecen según
• eje X de (-10,15) • eje Y de (-20, 140)
>>axis([-10,15,-20,140])
Si queremos graficar la función y(x) según
• color rojo • línea continua
• grosor de línea igual a 1.5 • con grilla, es decir, cuadrícula
• con título en azul (blue) y un recuadro verde
>>plot(x,y,'-r', 'LineWidth',1.5),grid,title('Grafica de una Parabola', 'color', 'b', 'EdgeColor', 'g');
Posteriormente haremos que la ventana sea cuadrada >>axis('square'), figure(gcf)
1.6 Editor de MATLAB
Matlab es un entorno de desarrollo que cuenta con su propio lenguaje de alto nivel, por lo que puede manipular archivos propios, que en este caso corresponden a los M-files ( archivos con extensión .m ).
El Editor de Matlab es una herramienta en la que se le pueden escribir de forma sencilla archivos tipo M-files. Los archivos M-files contienen las secuencias de comandos, los cuales será ejecutados (interpretados para ser más preciso), cuando en la ventana de comandos se haga el llamado respectivo al archivo *.m
Vista del Editor
Para crear un archivo M-file se debe abrir el editor, pudiendo hacerse de dos maneras distintas:
• desde la ventana de comandos escribir el comando edit, abriendose
automáticamente la ventan del editor.
• Ir al menú “File”, seleccionar “New” y “M-file”.
Los archivos M-files contienen un conjunto de instrucciones que Matlab interpreta y ejecuta en la ventana de comandos (Command Windows). De esta forma se pueden ejecutar varias tareas tan solo escribiendo un archivo M-file y luego llamándolo por su nombre en la “Ventana de Comandos”.
Comencemos con un ejemplo sencillo: EJEMPLO 1
============================================================
%Grafico de funciones
f=’(x-2)^2+(y-3)^2-5’;%(x-2)^2+(y-3)^2=5 en una circunferencia
ezplot(f); grid on %usando ezplot, lo rangos de las variables predeterminados son
2pi<=variable<=2pi
hold on;
ezplot(f,[ -1,5,0,6]); %en donde los números entre corchetes corresponden a los
rangos de las variables x e y dados por uno. [x,y,z,…], por lo tanto el par ordenado (-1,5) es el rango de x y el par ordenado (0,6) es el rango de y.
a=(-10:0.1:10);
b=a.^2; %parábola con una variable
hold on; %permite realizar varios gráficos en una misma ventana sin que se
plot(a,b);
g=’y-2*(x-3)^2+3’; %parábola y=2*(x-3)^2-3 con dos variables
hold on; ezplot(g);
hold off; %para que los futuros gráficos con se mezclen
============================================================
Se puede presenciar que corresponde al mismo orden que se usaba en la línea de comandos. Ahora se debe guardar el archivo en la ruta predefinida “C:\MATLAB6p5\work” con el nombre que se desee, en este caso “circulo”. Así creamos un archivo “circulo.m” que será llamado al igual como se ejecuta un comando, es decir,
>>circulo
Obteniendo de esta forma una grafica de la función que buscábamos.
-6 -4 -2 0 2 4 6
-6 -4 -2 0 2 4 6
x
y
y-2 (x-3)2+3 = 0
Ahora mostraremos otro ejemplo para lo que abriremos un archivo M-file nuevo.
EJEMPLO 2
============================================================
%Tareas Varias
[a,b]=meshgrid(-10:0.1:10,-10:0.1:10); %escribir varios rangos, en este caso para a
y b
c1='a.^2+2*a.*b+b.^2-8*a+8*b'; figure(1)
ezplot(c2) hold off x=-2:0.1:2; y=-3:0.1:3;
[u,v]=meshgrid(x,y); z=u.^2 – v.^2; figure(2);
mesh(x, y, z); %grafico de malla
figure(3);
contour(x, y, z); %grafico de contorno
figure(4);
surfc(x, y, z); %grafico de superficie y contorno
figure(5);
surf(x, y, z); %grafico de superficie
shading interp; %suavizado del grafico
============================================================
Llamaremos al archivo “varios.m”, lo guardaremos en la carpeta “work” nuevamente para posteriormente llamarlo desde la Ventana de Comandos
1.7Programación en MATLAB
Como ya se ha mencionado Matlab tiene un lenguaje de alto nivel incluido. La sintaxis de este lenguaje es similar a la del lenguaje C. A continuación se dan a conocer algunas palabras claves básicas para realizar un pequeño programa en Matlab.
Sintaxis Detalle
Entrada de datos variable=input(‘mensaje’); Salida de datos disp(valor); con un solo valor
disp([valor, valor, …]); con varios valores Salida de datos con
formato
fprintf(‘formatos’,variables); en donde los formatos pueden ser enteros (%d), reales (%f), etc.
Condiciones Son banderas que definen si existe un estado se realiza algo, sino, se realiza otra cosa. Las palabras claves if, else y end. En el ejemplo 1 se muestra su uso
Bucles Solo daremos a conocer la estructura while o mientras por el momento, que ejecuta una acción mientras se cumpla un estado. Las palabras claves son while y end. En el ejemplo 2 se muestra su uso.
Explicaremos más en detalle con varios ejemplos sencillos.
Ejemplo 1: mostrar el número mayor ingresado
============================================================ a=input('ingrese el primer dato: ');
b=input('ingrese el segundo dato: '); if a>b
m=a; else m=b; end disp(m);
============================================================ Lo guardamos con el nombre “ejem1.m”, y lo ejecutamos en la llamándolo por la Ventana de Comandos
Ejemplo 2: Suma de los n primeros números de una progresión armónica
============================================================ n=input('cantidad de términos: ');
s=0; while n>0 s=s+1/n; n=n-1; end disp(s); ============================================================
Lo guardamos con el nombre “ejem2.m” y lo ejecutamos llamándolo desde la Ventana de Comandos:
>>ejem2
Se puede concluir que la forma de programar en Matlab es muy sencilla y parecida a otros lenguajes de programación. La diferencia y ventaja de Matlab radica en la finalidad del entorno, ya que cuenta con herramientas matemáticas de nivel avanzado para áreas como calculo (limites, derivadas, integrales) y algebra (matrices, sumatorias), por lo tanto se pueden crear programas que fácilmente pueden desarrollar cualquier calculo matemático.
Ejemplo 3: Solución a un problema simple de algoritmos
Planteamiento del problema Una Profesora de séptimo básico quiere tener un control de su curso de n (n>2) alumnos, del los cuales por cada prueba que realice, quiere tener el promedio de las notas del curso completo y también quiere tener el nombre de la persona que tiene la mejor nota para entregarle un incentivo por su calificación y también la persona que tiene la peor nota para un mayor cuidado de ella, por su bajo rendimiento
Código solución
num_alumnos=input('ingrese numero de alumnos del curso ==> ');
if num_alumnos > 1; % condiciona el programa con 2 alumnos o mas para que tenga sentido
%Ingresa los datos de las notas en dos diferentes vectores con los mismos %subindices
i=1;
for k=1:num_alumnos
notas(i)=input('ingrese nota ==> '); nombre=input('ingrese nombre ==> ','s'); disp(' ');
celda(i)={nombre}; i=i+1;
end;
media=sum(notas)/num_alumnos;
sprintf('El Promedio de las notas es %d',media) %calcula al alumno con la mayor nota
i=1;
mayor=notas(1); subindice=i;
for k=1:num_alumnos; if mayor < notas(i); mayor=notas(i); subindice=i; end;
i=i+1; end;
disp('el alumno con la mayor nota es '); celda(subindice)
sprintf('Y su nota es %d',mayor)
%calcula al alumno con la menor nota i=1;
menor=notas(1); subindice=i;
for k=1:num_alumnos; if menor > notas(i); menor=notas(i); subindice=i; end;
i=i+1; end;
disp('el alumno con la menor nota es '); celda(subindice)
sprintf('Y su nota es %d',menor)
clear; % borra las variables ocupadas
Parte 2 Aplicaciones para análisis de señales.
A continuación se presentaran 4 aplicaciones simples las cuales podrán ser modificadas para implementar otro tipo de análisis sobre señales.
Aplicación 1 Armónicos de una señal cuadrada
El siguiente caso realiza la gráfica de una señal cuadrada con sus respectivos armónicos que a medida que corre la simulación es posible apreciar como se compone la señal original.
close all clear all
%programa para generar los armónicos de una señal cuadrada %con un periodo de T = 1 seg
T = 1;
Wo = 2*pi/T; t = 0:0.001:pi;
y = square(2*pi*t/T); plot(t,y,'r-')
grid figure
x = 0;
for k = 1:2:30
x = x + (4*sin(k*Wo*t))/(pi*k); y((k+1)/2,:) = x;
plot(t,x), pause end
title('componentes armónicos');
xlabel('tiempo'), ylabel('amplitud');
Aplicación 2 Gráfica de sinusoidales y análisis en frecuencia
En esta aplicación se presenta la creación de dos señales sinusoidales puras, las cuales permiten componer una tercera señal, hacer su respectivo análisis en frecuencia, sin y con ruido gaussiano.
clear all close all
%EJEMPLO DE ANALISIS ESPECTRAL
Fs = 1000; %frecuencia de muestreo t = 0:1/Fs:0.25; %vector con datos muestreados a 1 khz
x1=sin(2*pi*50*t); x2=2*sin(2*pi*100*t); subplot(411)
plot(t(1:100),x1(1:100)), title('señal sinusoidal pura 50 hz en el dominio del tiempo');
subplot(412)
plot(t(1:100),x2(1:100)), title('señal sinusoidal pura 100 hz en el dominio del tiempo');
n=256;
x = x1+x2; %suma de señales de 60 y 100 hz. subplot(413)
plot(t(1:100),x(1:100)), title('suma de señales sin ruido en el dominio del tiempo');
%*********************************
y1 = fft(x,256); %obtención de la fft utilizando 256 puntos %*********************************
yy1 = y1.*conj(y1)/256; %Obteniendo la norma
f1 = Fs/256*(0:127); %generación del vector frecuencia subplot(414)
plot(f1(1:100), yy1(1:100)); %graficando solamente 100 puntos axis([0 200 0 200])
set(gca,'xtick',[0:50:200]) title('Espectro de la señal'); grid
xlabel('frecuencia [hz]');
figure
y1 = x + 3*randn(size(t)); %adicionando ruido gaussiano con %desviación estándar de 3 y media cero subplot(211)
plot(t(1:100),y1(1:100)), title('señal con ruido en el dominio del tiempo'); xlabel('tiempo (seg)')
grid
y = fft(y1,256); %obtención de la fft utilizando 256 puntos yy = y.*conj(y)/256; %Obteniendo la norma
f = 1000/256*(0:127); %generación del vector frecuencia subplot(212)
axis([0 200 0 200])
set(gca,'xtick',[0:50:200]) title('Espectro de la señal'); grid
xlabel('frecuencia [hz]');
En la siguiente figura se muestran en el siguiente orden, función sinusoidal de 50Hz y amplitud 1; función sinusoidal de 100Hz y amplitud 2; suma de ambas señales; análisis espectral de la señal resultado de la suma, donde se aprecian los componentes en frecuencia de ambas señales.
Aplicación 3 Gráfica de sinusoidales utilizando Simulink
A continuación se presenta un análisis similar a los dos anteriores (en el dominio del tiempo), donde se utiliza el entorno gráfico provisto por Simulink, donde es posible componer varios escenarios de estudio.
Al lado izquierdo de la figura siguiente se muestran dos simulaciones:
• la primera es el despliegue de dos señales sinusoidales más una señal de
ruido blanco.
• La segunda es la suma de dos señales de distinta frecuencia y su posterior
Simulaciones mediante Simulink
Aplicación 4 Manejo de Audio
Ejemplo utilizando Simulink para la lectura de un dispositivo de entrada.
En este caso es posible verificar (posterior a la conexión del micrófono y parlantes en el PC) que efectivamente se realiza un registro de la señal capturada por el micrófono. Esta señal podría ser almacenada en un archivo para su posterior procesamiento. De la misma forma es que la plataforma permite leer datos de un archivo ya pre-existente, lo que facilita mucho el procesamiento de señales a todo nivel.
Parte 3 Aplicaciones para Inteligencia Artificial
1. Redes Neuronales
A continuación se realiza la codificación un perceptron multicapas (MLP) utilizando las funciones que trae incorporado el Toolbox de Redes Neuronales. Este código considera la solución del problema XOR.
% Implementacion de un MLP que sera entrenado con XOR % Patrones de Entrada
p= [0 0 1 1; 0 1 0 1];
% Target
T= [0 1 1 0];
% Creacion de la red con dos entradas, cuatro neuronas en la capa oculta y % 1 salida
net = newff (minmax (p), [4 1], {'logsig','logsig'}, 'traingd'); %trainlm'
% Se fijan parametros para el entrenamiento
net.trainParam.show = 250; %%25
net.trainParam.lr =0.2; %%0.02
net.trainParam.epochs = 10000; %%400
net.trainParam.goal = 1e-8;
% Entrenamiento
[net,tr] = train(net,p,T);
%% Simulacion despues de entrenar
a = sim (net,p); e = T -round(a)
% Mostrar los resultados
figure
plot(T,'x'); hold on
plot(a,'o');
% Mostrar los pesos de la red
net.IW{1} %pesos capa oculta
net.b{1} %bias capa oculta
net.LW{2} %pesos capa de salida
Gráficas que muestra el proceso de entrenamiento y la posterior salida de la Red.
Por otra parte Matlab ofrece un entrono gráfico para la implementación de redes neuronales que es llamado desde la línea de comandos con el término nntool, como se muestra en la siguiente imagen.
Inicio de herramienta nntool
Secuencia de configuración del nntool. Vector de
Entrada
Vector de Patrones (target)
Visualización de la Red Creación de la Red
Resultados, - Vector de salida de
la Red - Vector de Errores de
la Red
Secuencia de Configuración de la Red
2 Lógica Difusa
Como una forma de familiarizarse con el entorno de programación para Lógica Difusa de Matlab a continuación se muestra un ejemplo simple de implementación de un control de tráfico difuso para un semáforo utilizando las funciones que trae el Toolbox de Fuzzy y la interfaz gráfica de configuración de un Sistema Difuso.
Se desea controlar en tiempo real el periodo en que un semáforo estará en el estado de Luz Verde (paso de vehículo). Para lograr esto se cuenta con sensores que son capaces de entregar información respecto de la longitud de la cola de vehículos en la fase roja anterior y el ritmo de llegada de vehículos en la fase verde del semáforo.
Según el planteamiento de la problemática se tiene:
• Variables de entrada (o de estado)
o A: Ritmo de llegada de vehículos (en la fase verde del semáforo).
o Q: Longitud de la cola de vehículos (en la fase roja).
• Variables de salida (o de control)
o T: Tiempo de la fase verde del semáforo (con un valor máximo
prefijado).
• Etiquetas lingüísticas de cada variable:
o A : Ritmo de llegada.
o Q: Longitud de cola.
o T: Tiempo de fase verde
Por otra parte según opiniones expertas respecto de las funciones de pertenencia para cada una de las etiquetas lingüísticas se tiene lo siguiente:
Variables de entrada, Q y A
0
1 2 3 4 5 6 7 8 9 10
1
A
Coches Muy _Poc os Poco s Muc hos Muc hísi mos 01 2 3 4 5 6 7 8 9 10
Variable de salida T
Y las reglas difusas de control según se indica en la siguiente tabla las que son del tipo SI A Y Q ENTONCES T (también definidas por un experto en tránsito).
Q/A Muy_Pocos Pocos Muchos Muchisimos Larga Muy_Corto Corto Medio Largo
Media Muy_Corto Muy_Corto Corto Medio
Pequeña Muy_Corto Muy_Corto Muy_Corto Corto
Muy_Pequeña Muy_Corto Muy_Corto Muy_Corto Muy_Corto
Entonces teniendo clara la problemática y la solución de control difusa es necesario abrir el editor fuzzy (FIS Editor) desde la línea de comandos de Matlab con la sentencia fuzzy. Donde se apreciará la siguiente pantalla:
0
1 2 3 4 5 6 7 8 9 10
1
T
Segs. Muy
_Cor to
Cor to
Med io
Vista principal de la internas Fuzzy de Matlab.
Ahora es necesario según la definición de la problemática de control, las variables fuzzy y sus respectivas funciones de pertenencia, completar cada fase según se indica en la figura anterior, es decir,
• Ingresar las funciones de pertenencia para las variables de entrada A y Q. • Ingresar las funciones de pertenencia para las variables de salida T. • Ingresar las reglas de control.
Reglas Visualizador de Superficie generada
por las reglas Pantalla
inicial
Editor de Funciones de
pertenencia
Vista de las distintas configuraciones realizadas para este ejemplo.
Menu: View, Rule Viewer,
Variable A
Variable T Variable Q
Valores provenientes de los sensores (Valores CRISP)
Líneas Rojas
Resultado en tiempo del algoritmo de control (defuzificación)
Barra roja (centroide)