Curso Introduccion Al Matlab
Curso Introduccion Al Matlab
Curso Introduccion Al Matlab
Introducción
Podemos trabajar en el WORKSPACE o bien abrir una hoja en el editor de MATLAB y escribir
alli el programa para posteriormente ejecutarlo.
ejemplo:
help fft
Es conveniente abrir una hoja en el editor de MATLAB (M-file) para ir guardando lo que se va
escribiendo. También es posible ir generando el programa directamente en el command de
MATLAB la desventaja es que no se pueden guardar las instrucciones escritas.
INTRODUCCIÓN AL MATLAB 2
Operaciones con vectores y matrices
MATLAB puede operar con matrices por medio de operadores y por medio de funciones.
+ adición o suma
– sustracción o resta
* multiplicación
' traspuesta
^ potenciación
\ división-izquierda
/ división-derecha
.* producto elemento a elemento
./ y .\ división elemento a elemento
.^ elevar a una potencia elemento a
elemento
Estos operadores se aplican también a las variables o valores escalares, aunque con algunas
diferencias. Todos estos operadores son coherentes con las correspondientes operaciones
matriciales: no se puede por ejemplo sumar matrices que no sean del mismo tamaño. Si los
operadores no se usan de modo correcto se obtiene un mensaje de error.
Ejemplo:
Generemos las siguientes matrices
A = [1 2 3;4 5 6;7 8 9]; %generación de matriz de 3x3 elementos
multiplicar matrices
Z = A*B % multiplicación de matrices
Resultado
Z=
30 24 18
84 69 54
INTRODUCCIÓN AL MATLAB 3
138 114 90
Obtención de la inversa
P =[1 4 2;3 1 2;8 0 2]
PI = inv(P);
Probamos ahora con X = A\C´, los resultados deben ser los mismos
A = magic(3)
B = diag(diag(A))
C = [A, eye(3); zeros(3), B]
X = [A A’;ones(size(A)) A.^2]
Los dos puntos aislados representan "todos los elementos". Por ejemplo, el siguiente comando
extrae todos los elementos de la 3ª fila:
A(3, :) = 31, 9, 2, 22, 27, 20
Para acceder a la última fila o columna puede utilizarse la palabra end, en lugar del número
correspondiente. Por ejemplo, para extraer la sexta fila (la última) de la matriz:
A(end, :) = 4, 36, 29, 13, 18, 11
En los ejemplos anteriores se han extraído renglones y no columnas por motivos del espacio
ocupado por el resultado en la hoja de papel. Es evidente que todo lo que se dice para filas
vale para columnas y viceversa basta cambiar el orden de los índices.
El operador dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a
continuación define una matriz identidad B de tamaño 6 x 6 y se van a reemplazar filas de B
INTRODUCCIÓN AL MATLAB 6
por filas de A. Observe que la siguiente secuencia de comandos sustituye las filas 2, 4 y 5 de B
por las filas 1, 2 y 3 de A,
B = eye(size(A));
B([2 4 5],:)=A(1:3,:)
B = 1, 0, 0, 0, 0, 0
35, 1, 6, 26, 19, 24
0, 0, 1, 0, 0, 0
3, 32, 7, 21, 23, 25
31, 9, 2, 22, 27, 20
0, 0, 0, 0, 0, 1
Como nuevo ejemplo, se va a ver la forma de invertir el orden de los elementos de un vector:
x = rand(1,5)
x = 0.9103, 0.7622, 0.2625, 0.0475, 0.7361
x=x(5:-1:1)
x = 0.7361, 0.0475, 0.2625, 0.7622, 0.9103
Obsérvese que por haber utilizado paréntesis –en vez de corchetes– los valores generados por
el operador (:) afectan a los índices del vector y no al valor de sus elementos.
Para invertir el orden de las columnas de una matriz se puede hacer lo siguiente:
A=magic(3)
A= 8 1 6
3 5 7
4 9 2
A(:,3:-1:1)
A= 6 1 8
7 5 3
2 9 4
aunque hubiera sido más fácil utilizar la función fliplr(A), que es específica para ello.
Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A una
detrás de otra.
Matriz vacía A[ ]
Para MATLAB una matriz definida sin ningún elemento entre los corchetes es una matriz que
existe, pero que está vacía, o lo que es lo mismo que tiene dimensión cero.
Por ejemplo:
A=magic(3)
A=816
357
492
B = []
B=[]
exist(B) = [ ]
isempty(B) = 1
A(:,3)=[]
INTRODUCCIÓN AL MATLAB 7
A= 81
35
49
Operadores de Relación
En MATLAB los operadores relacionales pueden aplicarse a vectores y matrices, y eso hace
que tengan un significado especial.
Al igual que en C, si una comparación se cumple el resultado es 1 (true), mientras que si no se
cumple es 0 (false). Recíprocamente, cualquier valor distinto de cero es considerado como
true y el cero equivale a false. La diferencia con C está en que cuando los operadores
relacionales de MATLAB se aplican a dos matrices o vectores del mismo tamaño, la
comparación se realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del
mismo tamaño, que recoge el resultado de cada comparación entre elementos. Por ejemplo:
Formemos las siguientes matrices
A = [1 2;0 3];
B = [4 2;1 5];
A == B = 0 1
00
A ~= B 1 0
1 1
Operadores lógicos
Los operadores lógicos de MATLAB son los siguientes:
& and
| or
~ negación lógica
Las siguientes funciones exigen que el/los argumento/s sean matrices. En este grupo aparecen
algunas de las funciones más útiles y potentes de MATLAB. Se clasifican en varios subgrupos:
x 4 8 x 2 6 x 10 0
se puede representar mediante el vector [1, 0, -8, 6, -10]. MATLAB puede realizar diversas
operaciones sobre él, como por ejemplo evaluarlo para un determinado valor de x por ejemplo
c, (función polyval(pol, c)) y calcular las raíces (función roots()):
pol = [1 0 - 8 6 -10]
roots(pol) = -3.2800
2.6748
0.3026 + 1.0238i
0.3026 - 1.0238i
polyval(pol,1) = -11
Para calcular el producto de polinomios, MATLAB utiliza una función llamada conv() (de
convolución). En el siguiente ejemplo se va a ver cómo se multiplica un polinomio de segundo
grado por otro de tercer grado:
pol1 = [1 -2 4]
pol2 = [1 0 3 -4]
Funciones de función
En MATLAB existen funciones a las que hay que pasar como argumento otras funciones o
vectores. Así sucede por ejemplo si se desea calcular la integral definida de una función,
resolver una ecuación no lineal, o integrar numéricamente una ecuación diferencial ordinaria
(problema de valor inicial).
Ejemplo
Hagamos un programa para obtener las raíces de una ecuación de 2do orden
Abrimos el editor de MATLAB y escribimos lo siguiente:
function [X1,X2]=raices(A,B,C)
%este programa obtiene raices de una ecuacion de segundo
%orden hay que introducir los coeficientes de la ecuacion
%Ax+Bx+C=0
if nargin<3
error('faltan datos')
end
X1=(-B+sqrt(B^2-4*A*C))/2*A
X2=(-B-sqrt(B^2-4*A*C))/2*A
if isreal(X1)
disp('raices reales')
else
disp('raices imaginarias')
end
Ejemplo: escribamos una función que nos permita calcular parámetros estadísticos, iniciemos
con la media.
INTRODUCCIÓN AL MATLAB 11
function y = media(x)
%esta función calcula la media de un conjunto de valores
%almacenados en el vector x
n = length(x);
y = sum(x)/n;
Para agregarles titulo, nombres a los ejes, leyendas en la grafica etc se utilizan las siguientes
instrucciones:
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
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
Borrar texto (u otros elementos gráficos) es un poco más complicado. Para poder hacerlo hay
que recuperar previamente el valor de retorno del comando con el cual se ha creado. Después
hay que llamar a la función delete con ese valor como argumento. Considérese el siguiente
ejemplo:
v = text(1,.0,'seno')
delete(v)
Los dos grupos de funciones anteriores no actúan de la misma forma. Así, la función plot
dibuja una nueva figura en la ventana activa (en todo momento MATLAB tiene una ventana
activa de entre todas las ventanas gráficas abiertas), o abre una nueva figura si no hay ninguna
abierta, sustituyendo cualquier cosa que hubiera dibujada anteriormente en esa ventana. Para
verlo, creemos un par de vectores x e y con los que trabajar:
x = -10:0.2:10;
y = sin(x);
Ahora ejecutamos los comandos siguientes (se comienza cerrando la ventana activa, para que
al crear la nueva ventana aparezca en primer plano):
close
grid
plot(x,y)
Se puede observar la diferencia con la secuencia que sigue:
close
plot(x,y)
grid
El comando plot puede utilizarse también con matrices como argumentos. Por ejemplo:
Cuando se grafican varias funciones en una sola hoja es necesario diferenciar una de otra,
para ello se cuenta con los siguientes colores y caracteres.
Cuando hay que dibujar varias líneas, por defecto se van tomando sucesivamente los colores
de la tabla comenzando por el azul, hacia arriba, y cuando se terminan se vuelve a empezar
otra vez por el azul. Si el fondo es blanco, este color no se utiliza para las líneas.
Existe la posibilidad de añadir líneas a una gráfica ya existente, sin destruirlo o sin abrir una
nueva ventana. Se utilizan para ello los comandos hold on y hold off. El primero de ellos hace
que los gráficos sucesivos respeten los que ya se han dibujado en la figura (es posible que
haya que modificar la escala de los ejes); el comando hold off deshace el efecto de hold on.
El siguiente ejemplo muestra cómo se añaden las gráficas de y y z a la gráfica previamente
creada (cada una con un tipo de línea diferente):
plot(x)
hold on
plot(x2,'--')
plot(x3,'-.')
hold off
comando subplot
INTRODUCCIÓN AL MATLAB 14
Una ventana gráfica se puede dividir en m particiones horizontales y n verticales, con objeto de
representar múltiples gráficas en ella. Cada una de estas subventanas tiene sus propios ejes,
aunque otras propiedades son comunes a toda la figura. La forma general de este comando es:
subplot(m,n,i)
Se puede practicar con este ejemplo añadiendo títulos a cada subplot, así como etiquetas para
los ejes. Se puede intentar también cambiar los tipos de línea. Para volver a la opción por
defecto basta teclear el comando:
subplot(1,1,1)
axis(’auto’) devuelve las escalas de los ejes al valor por defecto o automático.
v=axis devuelve un vector v con los valores [xmin, xmax, ymin, ymax]
axis(axis) mantiene los ejes en sus actuales valores, de cara a posibles nuevas
gráficas añadidas con hold on
t = 0:0.001:1;
y = 2*sin(2*pi*40*t) + sin(2*pi*60*t);
plot(t,y)
Fs = 1000;
T1 = 0:1/Fs/1.5;
y1 = sawtooth(2*pi*40*T1);
Plot(T1,x); axis([0 0.2 -1 1])
y2 = square(2*pì*40*T2)
Plot(T2,y2); axis([0 0.2 -1 1])
Ejemplo: Generemos una señal senoidal x(t) = Asen(t + ). Con los siguientes parámetros:
A= 4; %Amplitud, la adición del carácter ( ; ) evita que se
despliegue el numero en pantalla
omega = 30; %Frecuencia angular
phi = pi/4; %Angulo de defasamiento
y = A*sin(omega*t + phi);
plot(t,y) %gráfica en forma continua
grid %adiciona a la gráfica una malla
title(‘Señal senoidal’)
xlabel('tiempo(seg)') %pone la etiqueta al eje X
ylabel('voltaje') %pone etiqueta al eje Y
gtext('punto máximo') %pone una leyenda que se puede colocar con el mouse
Si se llama a la función figure sin argumentos, se crea una nueva ventana gráfica con el
número consecutivo que le corresponda. El valor de retorno es dicho número. Por otra parte, el
comando figure(n) hace que la ventana n pase a ser la ventana o figura activa. Si dicha
ventana no existe, se crea una nueva ventana con el número consecutivo que le corresponda
(que se puede obtener como valor de retorno del comando). La función close cierra la figura
activa, mientras que close(n) cierra la ventana o figura número n. El comando clf elimina el
contenido de la figura activa, es decir, la deja abierta pero vacía.
La función gcf devuelve el número de la figura activa en ese momento. Para practicar un poco
con todo lo que se acaba de explicar, vamos a ejecutar las siguientes instrucciones observando
con cuidado los efectos de cada una de ellas en la ventana activa. El comando figure(gcf) (get
current figure) permite hacer visible la ventana de gráficos desde la ventana de comandos.
x = [-4*pi:pi/20:4*pi];
plot(x,sin(x),'r',x,cos(x),'g')
title('Función seno(x) -en rojo- y función coseno(x) -en verde-')
xlabel('ángulo en radianes'), figure(gcf)
ylabel('valor de la función trigonométrica'), figure(gcf)
axis([-12,12,-1.5,1.5]), figure(gcf)
axis('equal'), figure(gcf)
axis('normal'), figure(gcf)
axis('square'), figure(gcf)
axis('off'), figure(gcf)
axis('on'), figure(gcf)
axis('on'), grid, figure(gcf)
Existen otras funciones gráficas bidimensionales orientadas a generar otro tipo de gráficos
distintos de los que produce la función plot() y sus análogas. Algunas de estas funciones son
las siguientes:
INTRODUCCIÓN AL MATLAB 18
Ejemplo, genere un vector de valores aleatorios entre 0 y 10, y ejecute los siguientes
comandos:
x = [rand(1,100)*10];
plot(x)
bar(x)
stairs(x)
hist(x)
hist(x,20)
alfa=(rand(1,20)-0.5)*2*pi;
rose(alfa)
Graficas en 3D
Ejemplo:
subplot(221) %abre una hoja de donde se pueden colocar 4 imágenes
t=-pi:0.01:pi; %generación del vector de tiempo
y1 = sin(3*t)./t;
plot(t,y1); %gráfica en la posición (1,1)
title(‘función sampling’)
subplot(222) %se coloca en la figura (1,2)
stem(t,y1);
subplot(223) %grafica en al posición (2,1)
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t); % gráfica en tres dimensiones
INTRODUCCIÓN AL MATLAB 19
title(‘hélice’)
subplot(224); %grafica en la posición (2,2)
x = -8:0.5:8;
y = x;
[X,Y] = meshgrid(x,y); %convierte los vectores a matrices del tamaño de x
R = sqrt(X.^2+Y.^2);
z = sin( R )./R;
mesh(z); %grafica en tres dimensiones
grid
title(‘función sampling en tres dimensiones’)
Función input
La función input permite imprimir un mensaje en la línea de comandos de MATLAB y recuperar
como valor de retorno un valor numérico o el resultado de una expresión tecleada por el
usuario.
Después de imprimir el mensaje, el programa espera que el usuario teclee el valor numérico o
la expresión. Cualquier expresión válida de MATLAB es aceptada por este comando. El usuario
puede teclear simplemente un vector o una matriz. En cualquier caso, la expresión introducida
es evaluada con los valores actuales de las variables de MATLAB y el resultado se devuelve
como valor de retorno. Ejemplo:
En este caso el texto tecleado como respuesta se lee y se devuelve sin evaluar, con lo que se
INTRODUCCIÓN AL MATLAB 20
almacena en la cadena nombre. Así pues, en este caso, si se teclea una fórmula, se almacena
como texto sin evaluarse.
Función disp
La función disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz, pero
sin imprimir su nombre. En realidad, disp siempre imprime vectores y/o matrices: las cadenas
de caracteres son un caso particular de vectores. Ejemplos:
Algunas Aplicaciones
Series de Fourier
En análisis de señales es útil observar los componentes armónicos de una señal, el MATLAB
nos permite de manera fácil y rápida observar la adición de dichos componentes veamos como:
Sabemos que utilizando el análisis de Fourier podemos descomponer una señal en sus
componentes armónicos, por ejemplo si tenemos una señal cuadrada la cual podemos escribir
4v 1 4v 1 1
como f (t )
n 1 n
senn 0 t
( sen 0 t
3
sen3 0 t
5
sen5 0 t ...)
Vamos a graficar los armónicos de esta función generando uno por uno y posteriormente
haremos un programa para obtenerlos
t = 0:.1:10;
y = sin(t);
plot(t,y),
Primer armónico
y = sin(t) + sin(3*t)/3;
plot(t,y)
INTRODUCCIÓN AL MATLAB 21
t = 0:.02:3.14;
y = zeros(10,max(size(t))); %abriendo espacio para almacenar los
valores de los armónicos
x = zeros(size(t));
Análisis espectral
Analisis espectral
Fs = 1000; %frecuencia de muestreo
t = 0:1/Fs:0.25; %vector con datos muestreados a 1 khz
x = sin(2*pi*50*t) + 2*sin(2*pi*100*t); %suma de señales de 60 y 120 hz.
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)
plot(f(1:100), yy(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]')
INTRODUCCIÓN AL MATLAB 23
Convolución
Ejemplo 2: sea el pulso rectangular x(n) = u(n)-u(n-10) la entrada a un sistema cuya respuesta
al impulso es h(n) = (0.8)n u(n), encontrar la salida y(n). Sabemos que la salida esta dad por la
convolución entre x(n) y h(n).
A1=zeros(1,5)
A2=ones(1,10);
A3=zeros(1,40);
INTRODUCCIÓN AL MATLAB 24
X=[A1 A2 A3]; %generando la secuencia x(n)
n=-5:49;
stem(n,x)
grid
title('secuencia x(n)')
xlabel('n')
h=(0.9).^n; % generando la secuencia h(n)
subplot(311)
plot(n,x)
subplot(311)
stem(n,x)
title('secuencia x(n)')
subplot(312)
stem(n,h)
title('secuencia h(n)')
y=conv(x,h); % convolución entre x(n) y h(n)
subplot(313)
stem(y)
title('convolución entre h(n) y x(n)')
axis([0 60 0 15])
Transformada Z
Para encontrar la transformada Z y su inversa se tienen los sig comandos
Syms, ztrans, iztrans
syms n z
ztrans((0.9)^n)
Inversa
iztrans(z/(z-0.9))