Universidad de Castilla-La Mancha ETSI Industriales Una introducción a MATLAB Curso 04/05 1. Introducción. MATLAB es un programa de cálculo científico de gran versatilidad y facilidad de uso con un gran número de herramientas orientadas a una amplia diversidad de aplicaciones. Una vez iniciado MATLAB, podremos acceder a un completo tutorial de ayuda mediante el comando helpdesk. MATLAB proporciona también un conjunto de demostraciones de algunas de sus posibilidades accesible mediante el comando demo. Por su parte, en cualquier momento podremos acceder a la ayuda inmediata respecto de cualquier función mediante la orden help función. El elemento básico en MATLAB son las matrices, que son definidas mediante corchetes. Así >> A=[1 2 3 4 5 6] A = 1 2 3 4 5 6 define la matriz fila, mientras que la orden >> a=[1 2 3; 4 5 6] A = ( 1 2 3 4 5 6 ) a = 1 2 3 4 5 6 define la matriz con dos filas a = 1 2 3 4 5 6 Obsérvese que el operador ; separa una fila de la siguiente. Es importante destacar que MATLAB distingue entre mayúsculas y minúsculas, siendo por tanto diferentes a de A.
El operador ; al final de una sentencia hace que MATLAB omita la salida. Por otra parte, si no asignamos un nombre a la matriz definida, ésta se asigna de forma automática a la variable ans, por ejemplo, >> [1 2 3; 2 4 5] 1 2 3 2 4 5 Una de las características de MATLAB es la facilidad con la que opera con matrices, así el operador define la matriz traspuesta de la dada, >> b=a b = 1 4 2 5 3 6 La suma entre una matriz y un escalar produce lo siguiente, >> a+2 3 4 5 6 7 8 pero la orden >> a+b??? Error using ==> + Matrix dimensions must agree. da lugar a error pues las dimensiones de las matrices no son acordes. También es posible definir submatrices a través del operador : del siguiente modo
>> c=a(1:2,2:3) c = 2 3 5 6 La multiplicación de matrices se lleva a cabo con el operador *, siempre que las dimensiones sean compatibles. Así, >> a=[1 2 3; 4 5 6]; >> b=[2 3 1] ; >> a*b 11 29 >> b*a??? Error using ==> * Inner matrix dimensions must agree. También se pueden multiplicar dos matrices elemento a elemento usando el operador.*. En el siguiente ejemplo, el comando eye(n) define la matriz identidad de orden n: >> c=a *a c = 17 22 27 22 29 36 27 36 45 >> d=eye(3) d = 1 0 0
0 1 0 0 0 1 Nótese a continuación la diferencia entre el operador multiplicación, con y sin. >> c*d 17 22 27 22 29 36 27 36 45 >> c.*d 17 0 0 0 29 0 0 0 45 Del mismo modo actúan los operadores./ y.^, que dividen o elevan cada uno de los elementos de la matriz. Véanse los ejemplos, >> c^2 1502 1984 2466 1984 2621 3258 2466 3258 4050 >> c.^2 289 484 729 484 841 1296 729 1296 2025
el primero de los cuales calcula la multiplicación de c consigo misma, mientras que el segundo calcula el cuadrado de cada elemento de c. 1.1. Álgebra elemental. MATLAB dispone de diversos comandos para realizar distintos cálculos con matrices. El comando inv calcula la inversa de una matriz, siempre que ésta exista, mientras que det calcula su determinate: >> a=[1 0-1; 2 0-1; -1 1 2]; >> inv(a) -1 1 0 3-1 1-2 1 0 >> det(a) -1 Por su parte, el comando eig proporciona los autovalores de una matriz, y poly da como resultado los coeficientes del polinomio característico. Por ejemplo, >> a=[1 0-1; 2 1-1; -1 1 2]; >> eig(a) -0.0000 2.0000 + 1.0000i 2.0000-1.0000i donde, como puede observarse, aparecen dos autovalores complejos, 2 + i, 2 i, y el autovalor 0. Si hacemos, >> poly(a)
1.0000-4.0000 5.0000 0.0000 sabremos que el polinomio característico de a viene dado por λ 3 4λ 2 + 5λ. 1.2. Gráficas sencillas. El comando plot permite dibujar una poligonal que une un conjunto de puntos definidos mediante un par de vectores. Obsérvese el siguiente ejemplo: >> x=-1:0.3:1 x = -1.0000-0.7000-0.4000-0.1000 0.2000 0.5000 0.8000 >> y=x.^2 y = 1.0000 0.4900 0.1600 0.0100 0.0400 0.2500 0.6400 en él hemos definido un vector x tomando los puntos que están entre 1 y 1 con distancia 0,3. y el vector y, calculando los cuadrados de los elementos de x. El comando plot(x,y) dibuja una poligonal uniendo los puntos del plano con primera coordenada los elementos de x y segunda coordenada los elementos de y. Entre punto y punto, MATLAB introduce una recta. La sentencia siguiente >> plot(x,y, *- ) general el dibujo mostrado en la Figura 1.1. 2. Funciones. MATLAB permite trabajar con expresiones simbólicas de funciones de forma sencilla, y realizar cálculos sobre las mismas. Para definer una función usamos el comando inline como mostramos a continuación: >> f=inline( exp(x)-x^2-3*x ) f = Inline function: f(x) = exp(x)-x^2-3*x
Figura 1.1. Ejemplo del comando plot Para calcular el valor de esta función en un punto a basta escribir f(a), mientras que es posible esbozar su gráfica en un intervalo [a, b] con la sentencia fplot(f,[a b]). Por otro lado, el comando fzero(f,a) resuelve la ecuación f(x) = 0, en el punto más cercano al punto a. Si en lugar de dar el punto a damos un intervalo donde se encuentra una raíz, calcula ésta: >> fzero(f,[0,1]) 0.4568 3. El paquete simbólico. Una de los paquetes más útiles para el cálculo con MAT- LAB lo constituye el paquete simbólico o Symbolic Math Toolbox, que permite realizar cálculo simbólico avanzado, es decir, se puede prescindir de asignar un número a una variable y tratarla como una constante genérica. Por ejemplo, si tratamos de calcular el seno de una variable no numérica: >> y=sin(x)??? Undefined function or variable x. obtenemos un error, pues MATLAB no conoce el valor de x. Para declarar una variable como simbólica usamos la expresión >> syms x Ahora podemos evaluar expresiones que contengan a esta variable a través del comando simplify.
>> y=sin(x); z=cos(x); >> simplify(y^2+z^2) 1 También es posible definir matrices simbólicas del siguiente modo >> M=sym( [a b; c d] ) M = [ a, b] [ c, d] y ahora calcular, por ejemplo su determinante, y polinomio característico: >> det(m), poly(m) a*d-b*c x^2-x*d-a*x+a*d-b*c Con el paquete simbólico podemos calcular límites, derivadas, integrales impropias, etc. A continuación exponemos diversos ejemplos de estos cálculos. Para calcular el límite >> limit(sin(x)/x,0) lím x 0 sen(x), x 1
o un límite en infinito: >> syms n lím n >> limit((n^3+3*n^2-2*n)/(3*n^3-1),inf) n 3 + 3n 2 2n, 3n 3 1 1/3 También es posible definir expresiones simbólicas sin necesidad de declarar la variable previamente, >> f= exp(z^3)+sin(z)^2 f = exp(z^3)+sin(z)^2 y después es posible, por ejemplo, derivar: >> diff(f) 3*z^2*exp(z^3)+2*sin(z)*cos(z) En algunos casos la lectura de la salida que proporciona MATLAB no es muy legible. El comando pretty genera en ocasiones una visualización más usual. Si nuestra expresión depende de constantes o más variables, es posible especificar la variable de derivación del siguiente modo: >> f= a*exp(a+x)/sin(a*x) f = a*exp(a+x)/sin(a*x) >> diff(f, a )
exp(a+x)/sin(a*x)+a*exp(a+x)/sin(a*x)-a*exp(a+x)/sin(a*x)^2*cos(a*x)*x >> pretty(ans) exp(a + x) a exp(a + x) a exp(a + x) cos(a x) x ---------- + ------------ - ----------------------- sin(a x) sin(a x) 2 sin(a x) La integración se lleva a cabo con el comando int. Es posible hacer integrales definidas o indefinidas: >> f= a*exp(a*x) ; >> int(f, x ) exp(a*x) >> int(f, x,0,1) exp(a)-1 Es importante observar que el cálculo de una integral definida mediante la última sentencia es un cálculo simbólico, de manera que integrales como la siguiente >> int( exp(x^2), x,0,1) -1/2*i*erf(i)*pi^(1/2) no tienen mucho sentido, pues el resultado viene expresado mediante una función extraña, ya que no se conoce una primitiva de la función e x2. Sin embargo, si acudimos al análisis numérico, MATLAB proporciona varios comandos que permiten obtener aproximaciones numéricas de cualquier integral definida. Por ejemplo, para usar la regla de Simpson tenemos el comando quad que puede actuar sobre funciones o expresiones simbólicas
>> f=inline( exp(x.^2) ); >> quad(f,0,1) 1.4627 >> quad( x.*exp(x),0,1) 1.0000 Nótese en ambos casos la necesidad de usar los operadores de multiplicación o exponenciación de la forma.* ó.^. 4. Programación en MATLAB. Para finalizar con esta breve introducción a MAT- LAB es necesario hablar de los scripts o m-files que nos permiten elaborar programas para ejecutar en el entorno de MATLAB. Como ejemplo presentamos a continuación una pequeña implementación del método de Newton: function y = newton(f,x0) % f es una cadena de caracteres % x0 es el punto inicial df=diff(f); xk=1; x=0; while (abs(xk-x)>1.e-6) x=x0; xk = x0 - eval(f)/eval(df); x0=xk; end y=xk; El diseño del programa permite introducir tanto la función cuya raíz queremos encontrar como el punto para iniciar el algoritmo. Dado que introducimos parámetros en la ejecución hemos de formular el m-file como una function, tal y como aparece en la primera línea. El dato de salida es la variable y, el nombre del programa (que debe coincidir con el nombre del fichero m-file) es newton que depende de los parámetros de entrada f, que debe ser una cadena de caracteres y x0 un punto inicial. Las líneas siguientes, comenzando con % son comentarios.
El resto de las líneas son asignaciones y un bucle en el que se itera mediante el método de Newton hasta que la diferencia entre dos iteraciones consecutivas es menor que 10 6. Para poder ejecutar este programa debemos editarlo (MATLAB trae consigo un editor incorporado) y guardarlo como un fichero con extensión.m. Después, bastará que el fichero se encuentre en algún lugar en el que MATLAB lo pueda encontrar (en el path), para que pueda se ejecutado del siguiente modo: >> newton( exp(x)-x*sin(x),0) -0.7271