MATLAB Guía
MATLAB Guía
MATLAB Guía
MATLAB 5
Clculos matemticos
Desarrollo de algoritmos
Modelos y simulaciones
Para concluir esta breve referencia a la documentacin de MATLAB, debemos mencionar los
archivos en formato .pdf a los que puede accederse mediante Acrobat Reader versin 3 o superior
(Acrobat puede obtenerse va Internet www.acrobat.com en forma totalmente gratuita). Los
documentos de mayor importancia son:
c:\matlab\help\pfdocs\Getstart.pdf Getting started with MATLAB
contiene informacin muy til para el principiante;
c:\matlab\help\pfdocs\Refbook.pdf
Language Reference Manual
describe el funcionamiento de los comandos de MATLAB;
recomendamos especialmente imprimir y leer el primero de los documentos indicados, para tener
una idea clara del funcionamiento de MATLAB.
Resumiremos a continuacin unas pocas ideas elementales que es necesario dominar para trabajar
sin problemas con MATLAB.
Una vez iniciado MATLAB, ya sea a travs del Escritorio de Windows o por acceso a la carpeta de
Programas del men de inicio, aparece la Ventana de Comandos de MATLAB:
MATLAB opera en un entorno matricial con variables reales y/o complejas. Un escalar es tratado
como una matriz de una fila por una columna. Los comandos de MATLAB pueden ser grabados en
archivos especiales denominados genricamente Archivos-M. Cada variable asignada ocupa un
lugar en el Espacio de Trabajo (memoria fsica + memoria virtual) y sus caractersticas pueden ser
analizadas utilizando el Workspace Browser. Las rutas de acceso a archivos pueden ser analizadas y
modificadas por medio del Path Browser. En su momento trataremos lo relacionado a Simulink,
una herramienta de MATLAB que proporciona un entorno grfico muy sencillo para la simulacin
de sistemas dinmicos.
Un detalle muy importante a tener en cuenta es que MATLAB diferencia entre maysculas y
minsculas. Por lo tanto x y X referenciarn dos objetos distintos. Lo mismo vale para los
nombres de funciones, por lo que resulta aconsejable utilizar maysculas solamente en casos
especiales y fciles de recordar.
Veamos ahora algunos ejemplos que nos introducirn en las peculiaridades de MATLAB. Para dar
a una variable t el valor 5, escribimos en la Ventana de Comandos:
t=5
Observamos que, a pesar de no haberlo requerido, MATLAB
muestra inmediatamente el valor asignado a la variable t.
t=
5
Para evitar que MATLAB repita en cada expresin el o los valores asignados, debemos agregar al
final de la misma un punto y coma (;) Probmoslo:
x=2;
2 13
11 8
7 12
14 1
A(3,2)
ans =
6
3
10
Para obtener un espaciado no unitario, se especifica un incremento, por ejemplo 100:-7:50 produce
100:-7:50
ans =
100
93
86
79
72
65
58
51
0.7854
1.5708
2.3562 3.1416
Expresiones subindicadas con dos_puntos hacen referencia a porciones de una matriz. As por
ejemplo A(1:k,j) se refiere a los primeros k elementos de la columna j de la matriz A.
EXPRESIONES
Como muchos otros lenguajes de programacin, MATLAB opera sobre expresiones matemticas,
pero tales expresiones involucran matrices. Los elementos constitutivos de las expresiones son
Variables
Nmeros
Operadores
Funciones
Variables
MATLAB no requiere sentencias declarativas de tipo ni el dimensionamiento de sus variables.
Cuando MATLAB encuentra un nuevo nombre de variable, automticamente crea la variable y le
asigna el almacenamiento apropiado. Por ejemplo
cant_alumnos = 25
crea una matriz de 1-por-1 llamada cant_alumnos y almacena el valor 25 en su nico elemento.
Los nombres de variables consisten de una letra seguida de cualquier cantidad de letras, dgitos y
signos de subrayado (_). MATLAB utiliza solamente los primeros 31 caracteres de un nombre de
variable.
Nmeros
MATLAB emplea para los nmeros la notacin decimal convencional, con un punto decimal
opcional y un signo ms o menos antepuesto. La notacin cientfica utiliza la letra e para indicar
una potencia de diez como factor de escala. Los nmero imaginarios emplean i o j como sufijo.
Ejemplos de nmeros vlidos son
3
-99
0.001
9.6397238
1.6021e-20 6.02252e23
1i
3e5j
3 + 2i
Todos los nmeros son almacenados internamente empleando el formato largo especificado por la
norma IEEE. Los nmeros de punto flotante tiene una precision de aproximadamente 16 dgitos
decimales y un rango finito que va de aproximadamente 10-308 a 10+308 .
Operadores
Las expresiones utilizan operadores aritmticos y emplean las reglas de precedencia que nos son ya
familiares
+
adicin
sustraccin
*
multiplicacin
/
divisin
\
divisin por la izquierda (matricial)
potencia
'
(apstrofe): transpuesta compleja conjugada matricial
()
especifican el orden de evaluacin.
Funciones
MATLAB brinda un gran nmero de funciones matemticas standard incluyendo abs, sin, sqrt y
exp. Tomar la raz cuadrada o el logaritmo de un nmero negativo no produce error, sino que el
nmero complejo resultante es calculado automticamente. Asimismo posee numerosas funciones
matemticas especiales, incluyendo funciones de Bessel y gamma. La mayor parte de stas aceptan
argumentos complejos. Para obtener un listado de funciones elementales basta tipear help elfun
Elementary math functions.
Trigonometric.
sin
- Sine.
sinh
- Hyperbolic sine.
asin
- Inverse sine.
asinh
- Inverse hyperbolic sine.
cos
- Cosine.
cosh
- Hyperbolic cosine.
acos
- Inverse cosine.
acosh
- Inverse hyperbolic cosine.
tan
- Tangent.
tanh
- Hyperbolic tangent.
atan
- Inverse tangent.
atan2
- Four quadrant inverse tangent.
atanh
- Inverse hyperbolic tangent.
sec
- Secant.
sech
- Hyperbolic secant.
asec
- Inverse secant.
asech
- Inverse hyperbolic secant.
csc
- Cosecant.
csch
- Hyperbolic cosecant.
acsc
- Inverse cosecant.
acsch
- Inverse hyperbolic cosecant.
cot
- Cotangent.
coth
- Hyperbolic cotangent.
acot
- Inverse cotangent.
acoth
- Inverse hyperbolic cotangent.
Exponential.
exp
- Exponential.
log
- Natural logarithm.
log10
- Common (base 10) logarithm.
log2
- Base 2 logarithm and dissect floating point number.
pow2
- Base 2 power and scale floating point number.
sqrt
- Square root.
nextpow2 - Next higher power of 2.
Complex.
abs
- Absolute value.
angle
- Phase angle.
conj
- Complex conjugate.
imag
- Complex imaginary part.
real
- Complex real part.
unwrap
- Unwrap phase angle.
isreal
- True for real array.
cplxpair - Sort numbers into complex conjugate pairs.
Rounding and remainder.
fix
- Round towards zero.
floor
- Round towards minus infinity.
ceil
- Round towards plus infinity.
round
- Round towards nearest integer.
mod
- Modulus (signed remainder after division).
rem
- Remainder after division.
sign
- Signum.
A ttulo ilustrativo, echemos una ojeada al espacio de trabajo que hemos generado con nuestros
ejemplos:
El comando format
Este comando controla el formato numrico de los valores mostrados por MATLAB. Mostramos
un ejemplo de los diversos formatos de visualizacin para un vector x con componentes de muy
distinta magnitud
x = [4/3 1.2345e-6];
format short
x
format long
x
x=
x=
1.3333
0.0000
1.33333333333333 0.00000123450000
format short e
x
format long e
x
x=
x=
1.3333e+000 1.2345e-006
format short g
x
x=
1.333333333333333e+000
1.234500000000000e-006
1.3333 1.2345e-006
GRAFICACIN
Deseamos crear un grfico de la funcin e-0.2t.sen(t) para valores de la variable independiente
comprendidos en el intervalo [0, 6], nos valemos para ello de los comandos
t=0:pi/100:6*pi;
y=exp(-0.2*t).*sin(t);
plot(t,y)
obteniendo el siguiente resultado en pantalla:
Observemos que tanto t como exp(-0.2*t) como sin(t) son matrices (hablando con propiedad,
vectores fila de 1 fila por 100 columnas), por lo que la multiplicacin de la funcin exponencial por
la funcin seno no puede ser indicada simplemente con el operador *. Esto es as porque la
multiplicacin de matrices exige que las mismas sean conformables -es decir, que la cantidad de
columnas de la matriz multiplicando sea igual a la cantidad de filas del multiplicador: X(mxn) *
Y(nxp) = Z(mxp) -. Ahora bien, nosotros deseamos multiplicar escalarmente cada valor de exp(0.2*t) por el valor de sin(t) correspondiente al mismo instante t, por lo tanto empleamos el
operador
.*
("punto por")
para indicar este tipo de operacin.
Podemos agregar el reticulado, etiquetas a los ejes, ttulo a la figura y leyendas descriptivas
mediante los comandos:
grid on
xlabel('t (tiempo)')
ylabel('y(t)')
title('OSCILACION AMORTIGUADA exp(-0.2*t).*sin(t)')
text(6, 0.5, 'Perodo de oscilacin 2{\pi}')
Finalmente, podemos copiar la figura con la opcin Copy Figure del men Edit de la misma,
obteniendo el grfico:
O SCILACION AMORT IG UADA exp(-0.2*t).*sin(t)
1
0.8
0.6
Perodo de oscilacin 2
y(t)
0.4
0.2
0
-0.2
-0.4
10
t (tiempo)
15
20
Y an podemos jugar con el grosor de la lnea y el rango de los ejes, empleando los comandos
hold on
%mantiene la figura anterior
plot(t,y,'LineWidth',2)
axis([0 20 -1 1])
plot(t,exp(-0.2*t),':') % ':' muestra lnea punteada
plot(t,-exp(-0.2*t),':')
text(11, -0.3,'\it{envolventes en lneas de puntos}')
Con lo que, en definitiva, obtenemos la figura de la pgina siguiente.
y(t)
0.2
0
-0.2
envolventes en lneas de puntos
-0.4
-0.6
-0.8
-1
10
t (tiempo)
15
20
9
9
=
2
s + 0.6s + 10.05s + 4.6s + 9 P( s )
4
con s = j
0.6000 10.0500
r=
-0.0500+ 2.9996i
-0.0500- 2.9996i
-0.2500+ 0.9682i
-0.2500- 0.9682i
4.6000
10
Para trabajar en escala logartmica MATLAB permite, mediante el uso la funcin logspace, definir
un vector de valores de la variable independiente -que llamaremos om- logartmicamente
espaciados. El comando es
om=logspace(-1,2,1000);
y genera 1000 valores logartmicamente distribuidos entre 10-1 y 102 que corresponden a los
extremos inferior (0.1) y superior (100) del rango de inters para nuestro problema.
Evaluamos ahora el mdulo de H(j) -que almacenamos en el vector h- aplicando al polinomio
(almacenado en la variable p), las funciones abs (valor absoluto: que en el caso de un complejo
corresponde al mdulo) y polyval (que calcula el valor del polinomio para los valores de la
variable de su segundo argumento,
h=9./abs(polyval(p,om*i));
% Ntese que como 9 es un escalar,
% y el denominador produce un vector,
% resulta necesario realizar la divisin
% con el operador ./
log10
Slo nos resta ahora graficar h_db versus om para completar el diagrama de Bode del mdulo de
H(j). Empleamos para ello la funcin semilogx (cuyo nombre aclara totalmente su cometido).
semilogx(om,h_db)
Resultando la figura
20
0
-20
-40
-60
-80
-100
-120
-140
-160
-1
10
10
10
10
11
0
-20
-40
-60
-80
-100
-120
-140
-1
10
10
10
Pulsacin en rad/s
10
con = arg{ P ( j )}
Evaluamos la fase del polinomio denominador, en todo el rango de con el comando angle que
brinda como resultado el argumento (o ngulo de fase) de un nmero complejo, e inmediatamente
lo graficamos
w=-angle(polyval(p,om*i));
% almacenamos en w la fase de p
semilogx(om,w);
% graficamos y oh sorpresa!
4
3
2
1
0
-1
-2
-3
-4
-1
10
10
10
10
La figura nos aparece con las ordenadas en radianes y, lo que es verdaderamente grave, una
injustificable discontinuidad (salto de valor 2) en 3 rad/s. Pero no hay que apenarse! Ello se
debe al algoritmo empleado por MATLAB en angle. Afortunadamente, tenemos la solucin por
medio de unwrap. Con unwrap, pasando radianes a grados y un poco de manicura...
12
fi=180*unwrap(w)/pi;
% Convierte radianes en grados
semilogx(om,fi);
grid on
axis([.1 100 -360 0])
title('Funcin de Transferencia de 4 Orden - Doble Resonancia')
xlabel('Pulsacin {\omega} en rad/s')
ylabel('Fase de H(j{\omega}) en grados')
-50
-100
-150
-200
-250
-300
-350
10
-1
10
10
Pulsacin en rad/s
10
Archivos Script
Mucho nos agradara, en nuestro afn de simplificar tareas, guardar todos los comandos que hemos
empleado en el punto precedente, de manera de tenerlos disponibles para cualquier otra ocasin que
se nos presente un problema similar. Y lo vamos a hacer empleando el icono New M-File de la
barra de tareas.
Aparece la siguiente pantalla, sobre la cual podemos rescribir los comandos anteriores o, si somos
ms duchos, podemos copiar con Ctrl.-C y Ctrl.-V las lneas escritas en la Ventana de Comandos:
13
ste es un editor de texto, con alguna funciones auxiliares que invitamos a experimentar.
Procediendo entonces como dijimos en la pgina precedente, llegamos a
% FT_4o_ORDEN
% F. DE TRANSFER. H(s)=9/(s^4+0.6s^3+10.05s^2+4.6s+9)
% diagramas de Bode de amplitud y fase
p=[1.0000
0.6000
10.0500
4.6000
9.0000]; % Coeficientes
% Races
r=roots(p);
om=logspace(-1,2,1000);
% 1000 valores de om entre 0.1 y 100
h=9./abs(polyval(p,om*i)); % Mdulo de h
h_db=20*log10(h);
% decibeles
figure(1);
% define la Figura 1 como la figura actual
semilogx(om,h_db);
% Grfico semilogartmico del mdulo en db
grid on
axis([.1 100 -140 20])
title('Funcin de Transferencia de 4 Orden - Doble Resonancia')
xlabel('Pulsacin {\omega} en rad/s')
ylabel('Mdulo de H(j{\omega}) en db.')
w=-angle(polyval(p,om*i)); % Clculo del argumento
fi=180*unwrap(w)/pi; % Elimina discontinuidades y transforma a grados
figure(2);
% define la Figura 2 como la figura actual
semilogx(om,fi); %Grfico semilogartmico del ngulo de fase en grados
grid on
axis([.1 100 -360 0])
title('Funcin de Transferencia de 4 Orden - Doble Resonancia')
xlabel('Pulsacin {\omega} en rad/s')
ylabel('Fase de H(j{\omega}) en grados')
... y con el comando Save del men File lo podemos almacenar como archivo .m en un directorio
tal como C:\MATLAB\ejercicios (que deberemos haber creado anteriormente) bajo el nombre
ft_4o_orden.m
Desde el momento que se encuentra almacenado, este archivo puede ser invocado desde la Ventana
de Comandos introduciendo simplemente su nombre de la siguiente forma
ft_4o_orden
??? Undefined function or variable 'ft_4o_orden'.
14
Para que el camino se incorpore en forma permanente a la ruta de bsqueda, deber responderse
afirmativamente al cuadro de dilogo que aparece a continuacin
Un archivo .m como el que acabamos de generar se conoce como script. Un script no posee
argumentos de entrada y al ser invocado, MATLAB simplemente ejecuta los comandos que
encuentra en el archivo generando o modificando valores en el espacio de trabajo.
Un segundo tipo de archivos .m son las funciones function, las cuales aceptan argumentos de
entrada y devuelven valores en los argumentos de salida; las variables internas de una funcin son
locales a la misma y no afectan al espacio de trabajo.
15
Nosotros emplearemos normalmente ode45 y utilizaremos ode15s tan slo cuando notemos que la
solucin tarda excesivamente en ser calculada, lo que ocurre cuando la curva solucin (t)
presenta flancos muy abruptos (casi verticales).
ode45 implementa un algoritmo de Runge-Kutta modificado, de paso de integracin variable,
desarrollado por Dormand-Prince.
Invocaremos ode45 para resolver una ecuacin diferencial de alguna de las maneras alternativas
siguientes:
[T,Y] = ode45('F', rango_tiempo, y0)
[T,Y] = ode45('F', rango_tiempo, y0, opciones)
[T,Y] = ode45('F', rango_tiempo, y0, opciones, p1, p2, . . .)
opciones
Como ejemplo aplicativo, veamos la solucin de la ecuacin diferencial de Van der Pol, que es de
la forma
y (1 y 2 ) y + y = 0
que equivale al sistema de dos ecuaciones diferenciales de primer orden
y 1 = y 2
2
y 2 = (1 y1 ) y 2 y1
El archivo-M
function out1= vdpl(t,y)
%Resuelve Van der Pol con mu=1
out1= [y(2); (1-y(1)^2)*y(2)-y(1)];
define este sistema de ecuaciones con =1. La grabamos bajo el nombre vdpl.m Para resolver el
sistema de Van der Pol en el intervalo de tiempo [0 20] con los valores iniciales y(1)=2 e y(2)=0,
invocamos
[t,y]=ode45('vdpl',[0 20],[2;0])
plot(t,y(:,1),'-',t,y(:,2),'-.')
16
2
y(t)
-1
-2
-3
10
t
15
20
Como vemos, el procedimiento no es para nada complicado. Lo que debe quedar claro respecto de
la funcin vdpl que creamos ms arriba, es que out1 es un vector columna de dos componentes.
Por ello, tambin las condiciones iniciales y0 son introducidas en los argumentos de ode45 como un
vector columna [2; 0].
Resulta instructivo analizar el contenido de las primeras 10 componentes de las variables t e y:
t(1:10)
y(1:10,:)
ans =
ans =
0
2.5119e-005
5.0238e-005
7.5357e-005
0.00010048
0.00022607
0.00035166
0.00047726
0.00060285
0.0012308
2
2
2
2
2
2
2
2
2
2
0
-5.0236e-005
-0.00010047
-0.0001507
-0.00020092
-0.00045199
-0.00070296
-0.00095383
-0.0012046
-0.0024571
ganamos as, un conocimiento adicional acerca de la cantidad de valores que calcula y almacena
MATLAB al resolver una ecuacin diferencial.
Los interesados en realizar elaboraciones algo ms profundas, pueden utilizar el comando help
odefile y consultar las pginas 2-453 a 2-472 del documento Refbook.pdf.
17