Introducción a MATLAB Gerardo Rodríguez Universidad de Salamanca MATLAB (MATrix LABoratory) es un sistema interactivo de software para gráficas y cálculos numéricos. Como su nombre indica, MATLAB está especialmente diseñado para cálculos con matrices: resolución de sistemas de ecuaciones lineales, factorización de matrices, etc. Además, tiene una gran variedad de capacidades gráficas, y puede ampliarse mediante programas escritos en su propio lenguaje de programación. MATLAB se construye en torno al lenguaje MATLAB. La forma de ejecutar este código es sencilla; basta con escribirlo en el prompt, >>, en la ventana de comandos, uno de los elementos del escritorio de MATLAB. Las secuencias de comandos pueden guardarse en un archivo de texto, normalmente utilizando el editor de MATLAB, como un script o encapsulado como una función, ampliando así los comandos disponibles. En las siguientes secciones, daremos una introducción a algunas de las características más útiles de MATLAB. Hay un montón de ejemplos. La mejor manera de aprender a utilizar MATLAB es leer este documento mientras se ejecuta MATLAB, experimentando e intentando realizar los ejemplos. Introduciendo vectores y matrices. El tipo de datos básico en MATLAB es una tabla n-dimensional de números de doble precisión. Los nuevos tipos de datos incluyen estructuras, clases, y "cell arrays", que son tablas (matrices) con la posibilidad de contener diferentes tipos de datos. Los siguientes comandos muestran cómo introducir números, vectores y matrices, y asignarlos a las variables >> a = 2 //scalar Si se pulsa enter, se verá: a = 2 >> x = [;2;3] //Vector Presionando enter, x = 2 3 >> A = [ 2 3;4 5 6;7 8 0] //Matrix Capítulo 2 pág.
Presionando enter, A = 2 3 4 5 6 7 8 0 Nótese que las filas de una matriz están separadas por punto y coma, mientras que las entradas de cada fila están separadas por espacios (o comas). Un comando útil es whos, que muestra los nombres de todas las variables definidas y sus tipos: >> whos Name Size Bytes Class A 3x3 72 double array a x 8 double array x 3x 24 double array Grand total is 3 elements using 04 bytes Hay que tener en cuenta que cada una de estas tres variables es una tabla, la "forma" de la tabla determina su tipo exacto. El escalar 'a' es una tabla, el vector 'x' es una tabla 3, y la matriz 'A' es una tabla 3 3 (véase el tamaño-size de entrada para cada variable). Una forma de introducir una tabla n-dimensional (n>2), consiste en concatenar dos o más tablas (n-)-dimensionales utilizando el comando cat. Por ejemplo, el siguiente comando concatena dos matrices 3 2 para crear una matriz 3 2 2: >> C = cat(3,[,2;3,4;5,6],[7,8;9,0;,2]) C(:,:,) = 2 3 4 5 6 C(:,:,2) = 7 8 9 0 2 >> whos Name Size Bytes Class A 3x3 72 double array C 3x2x2 96 double array a x 8 double array x 3x 24 double array Grand total is 25 elements using 200 bytes El argumento "3" en el comando cat indica que la concatenación resultante tendrá dimensión 3. Si D y E fueran matrices k m n, el comando >> cat(4,d,e) Capítulo 2 pág. 2
crearía una matriz k m n 2 (puedes intentarlo). MATLAB permite introducir matrices con números complejos. La unidad imaginaria i = está representada por cualquiera de las variables predefinidas i o j: >> sqrt(-) 0 +.0000i Este ejemplo muestra cómo aparecen los números complejos en MATLAB, y también pone de manifiesto que la raíz cuadrada es una función predefinida. El resultado del último cálculo no asignado a una variable se asigna automáticamente a la variable ans, que puede entonces ser utilizada como cualquier otra variable en los cálculos posteriores. He aquí un ejemplo: >> 00^2-4*2*3 //Press enter 9976 >> sqrt(ans) //Press enter 99.8799 >> (-00+ans)/4 //Press enter -0.0300 Los operadores aritméticos trabajan como se espera de los números. Una variable predefinida que se utiliza a menudo es p: >> pi //Press enter 3.46 Algunas de las funciones útiles, tales como seno, coseno, tangente, exponencial y logaritmo están predefinidas. Por ejemplo: >> cos(.5)^2+sin(.5)^2 //Press enter >> exp() //Press enter 2.783 >> log(ans) //Press enter Capítulo 2 pág. 3
Si se tiene alguna duda acerca de cualquier comando o función, se puede acceder a un amplio sistema de ayuda en línea mediante la expresión help <command-name>. Por ejemplo: >> help ans ANS The most recent answer. ANS is the variable created automatically when expressions are not assigned to anything else. ANSwer. >> help pi PI 3.45926535897... PI = 4*atan() = imag(log(-)) = 3.45926535897... Una buena forma de empezar a utilizar esta expresión es con el comando help help, que explica cómo trabaja el sistema de ayuda, así como algunos comandos relacionados. Si se escribe únicamente help, produce una lista de temas para los que hay ayuda disponible; Si observamos dicha lista nos encontramos con la entrada elfun-- elementary math functions ("elfun-- funciones matemáticas elementales"). Escribiendo help elfun se obtiene una lista de las funciones matemáticas disponibles. Operaciones aritméticas con matrices. MATLAB puede realizar las operaciones aritméticas estándar con matrices, vectores y escalares: suma, resta y multiplicación. Además, MATLAB define una noción de división de matrices, así como operaciones "vectorizadas". Todas las operaciones vectorizadas (en éstas se incluyen suma, resta, y multiplicación por un escalar, como se explica más adelante) se pueden aplicar a tablas n-dimensionales para cualquier valor de n, pero la multiplicación y la división se limitan a vectores y matrices (n 2). Operaciones estándar Si A y B son matrices, entonces MATLAB puede calcular A+B y A-B cuando estas operaciones están definidas. Por ejemplo, consideremos los siguientes comandos: >> A = [ 2 3;4 5 6;7 8 9]; >> B = [ ;2 2 2;3 3 3]; >> C = [ 2;3 4;5 6]; >> whos Name Size Bytes Class A 3x3 72 double array B 3x3 72 double array C 3x2 48 double array Grand total is 24 elements using 92 bytes >> A+B Capítulo 2 pág. 4
2 3 4 6 7 8 0 2 Pero si se escribe: >> A+C??? Error using ==> + because Matrix dimensions must agree. La multiplicación de matrices también se define: >> A*C 22 28 49 64 76 00 >> C*A??? Error using ==> * because Matrix dimensions must agree. Si A es una matriz cuadrada y m un entero positivo, entonces A^m es el producto de m factores de A. Sin embargo, no está definida ninguna noción de multiplicación para tablas multidimensionales con más de 2 dimensiones: >> C = cat(3,[ 2;3 4],[5 6;7 8]) C(:,:,) = 2 3 4 C(:,:,2) = 5 6 7 8 >> D = [;2] D = 2 >> whos Name Size Bytes Class C 2x2x2 64 double array D 2x 6 double array Grand total is 0 elements using 80 bytes >> C*D??? Error using ==> * No functional support for matrix inputs. Capítulo 2 pág. 5
De la misma manera, el operador exponencial ^ solamente está definido para tablas cuadradas de dimensión 2 (matrices). Resolviendo ecuaciones matriciales utilizando matrix division (división de matrices). Si A es una matriz cuadrada, no singular, entonces la solución de la ecuación Ax = b es x = A b. MATLAB lleva a cabo esta operación con el operador backslash (barra invertida) \: >> A = rand(3,3) A = 0.290 0.6793 0.594 0.0470 0.9347 0.830 0.6789 0.3835 0.0346 >> b = rand(3,) b = 0.0535 0.5297 0.67 >> x = A\b x = -59.3380 34.8625-344.5078 Nota: el uso de la función predefinida rand, crea una matriz con entradas de una distribución uniforme en el intervalo (0,). (Véase help rand para obtener más información). La expresión A\b es (matemáticamente) equivalente a multiplicar b por la izquierda por A (sin embargo, MATLAB no calcula la matriz inversa, sino que resuelve el sistema lineal directamente). Cuando se usa con una matriz no cuadrada, el operador backslash resuelve el sistema adecuado por el método de mínimos cuadrados; ver help slash para obtener más detalles. Por supuesto, como con los otros operadores aritméticos, las matrices deben ser compatibles en tamaño. El operador división no está definido para tablas n- dimensionales con n>2. Funciones y operadores "vectorizados" MATLAB tiene muchos comandos para crear matrices especiales; el siguiente comando crea un vector fila cuyos elementos aumentan aritméticamente: >> t = :5 t = 2 3 4 5 Capítulo 2 pág. 6
Los elementos pueden cambiar por pasos no unitarios: >> x = 0:.: x = Columns through 7 0 0.000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 0.7000 0.8000 0.9000.0000 También está permitido un paso negativo. El comando linspace produce resultados similares. Crea un vector con entradas con paso lineal. En concreto, linspace (a,b,n) crea un vector de longitud n con las b a 2( b a) entradas a, a +, a +,..., b : n n >> linspace(0,,) Columns through 7 0 0.000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 0.7000 0.8000 0.9000.0000 Existe un comando similar, logspace, para la creación de vectores con entradas con paso logarítmico: >> logspace(0,,) Columns through 7.0000.2589.5849.9953 2.59 3.623 3.98 Columns 8 through 5.09 6.3096 7.9433 0.0000 Véase help logspace para obtener más detalles. Un vector con entradas con paso lineal, puede considerarse como la definición de una red unidimensional, lo cual es útil para las gráficas de funciones. Para crear una gráfica de y = f(x) y conectarla con segmentos lineales, uno puede crear una red en el vector x y luego crear un vector y con los correspondientes valores de la función. Es fácil crear los vectores necesarios para representar gráficamente una función predefinida, ya que las funciones de MATLAB están vectorizadas. Esto significa que si una función predefinida como la función seno, se aplica sobre una tabla, el efecto que se consigue es crear una nueva tabla del mismo tamaño cuyas entradas son los valores de la función sobre las entradas de la tabla original. Por ejemplo (véase la Figura ): >> x = (0:.:2*pi); >> y = sin(x); >> plot(x,y) Capítulo 2 pág. 7
Figura : Gráfica de y = sin(x) MATLAB ofrece también operadores aritméticos vectorizados, que son los mismos que los operadores ordinarios, precedidos por ".". Por ejemplo, para representar x gráficamente y = : 2 + x >> x = (-5:.:5); >> y = x./(+x.^2); >> plot(x,y) 0.5 0.4 0.3 0.2 0. 0-0. -0.2-0.3-0.4-0.5-5 -4-3 -2-0 2 3 4 5 Figura 2: Gráfica de x y = + x 2 Capítulo 2 pág. 8
x.^2 eleva al cuadrado cada uno de los componentes de x, y x./z divide cada uno de los componentes de x por el correspondiente componente de z. La suma y la resta se realizan componente a componente por definición y no hay operadores".+" o ".-". Obsérvese la diferencia entre A^2 y A.^2. El primero está definido sólo si A es una matriz cuadrada, mientras que el segundo se define para cualquier lista n-dimensional A. Algunos comandos. Un importante operador en MATLAB es la comilla simple ', que representa la matriz traspuesta (conjugada). >> A = [ 2;3 4] A = 2 3 4 >> A' 3 2 4 >> B = A + i*.5*a B =.0000 + 0.5000i 2.0000 +.0000i 3.0000 +.5000i 4.0000 + 2.0000i >> B'.0000-0.5000i 3.0000 -.5000i 2.0000 -.0000i 4.0000-2.0000i En el caso de que haya que calcular la matriz traspuesta, en lugar de la conjugada traspuesta, se utiliza el operador.' : >> B.'.0000 + 0.5000i 3.0000 +.5000i 2.0000 +.0000i 4.0000 + 2.0000i (Obsérvese que ' y.' son equivalentes para matrices reales). Los siguientes comandos son de uso frecuente. Se puede obtener más información con el sistema de ayuda on-line. Creando matrices. zeros(m,n) crea una matriz m n de ceros; ones(m,n) crea una matriz m n de unos; Capítulo 2 pág. 9
eye(n) crea la matriz identidad n n ; diag(v) (v es un n-vector) crea una matriz diagonal n n con v en la diagonal. Por ejemplo: >> ones(3,4) >> v=[- 2 3.5] v = -.0000 2.0000 3.5000 >> diag (v) -.0000 0 0 0 2.0000 0 0 0 3.5000 Los comandos zeros y ones pueden usarse con cualquier par de números naturales como argumentos; con k argumentos proporcionan una lista k-dimensional del tamaño indicado. Formato de salida y gráficas. Los siguientes comandos proporcionan diferentes apariencias a las distintas salidas. format : Da el formato de salida >> format short, pi 3.46 >> format short e, pi 3.46e+000 >> format long, pi 3.459265358979 >> format long e, pi 3.4592653589793e+000 format compact suprime un retorno extra (todas las salidas de este artículo están dadas en este formato). format loose coloca un retorno al principio de la salida. >> format loose, pi 3.46 xlabel('string'), ylabel('string') pone una etiqueta en los ejes de abscisas y ordenadas, respectivamente, en la gráfica activa; title('string') añade un título a la gráfica activa; Capítulo 2 pág. 0
axis([a b c d]) cambia la representación de la gráfica activa al rectángulo a x b, c y d ; grid añade una malla rectangular a la gráfica active; hold on congela la gráfica active y presenta las gráficas siguientes con la gráfica actual; hold off presenta la gráfica activa. La gráfica siguiente se presenta después de borrar la anterior; subplot pone múltiples gráficas en una única ventana gráfica. Por ejemplo: >> xlabel('x-axis'); >> ylabel('y-axis'); >> title('example'); example 0.9 0.8 0.7 0.6 y-axis 0.5 0.4 0.3 0.2 0. >> axis([- - ]); 0 0 0. 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 x-axis 0.8 0.6 0.4 0.2 example y-axis 0-0.2-0.4-0.6-0.8 - - -0.8-0.6-0.4-0.2 0 0.2 0.4 0.6 0.8 x-axis Capítulo 2 pág.
>> grid on 0.8 example 0.6 0.4 0.2 y-axis 0-0.2-0.4-0.6-0.8 - - -0.8-0.6-0.4-0.2 0 0.2 0.4 0.6 0.8 x-axis Dibujaremos la función y= exp (-x^2) con malla, nombre y ejes. >> u=x.^2; >> y= exp(-u); >> plot (x,y); example 0.9 0.8 0.7 y-axis 0.6 0.5 0.4 - -0.8-0.6-0.4-0.2 0 0.2 0.4 0.6 0.8 x-axis Ahora usamos la función subplot para visualizar diferentes funciones al mismo tiempo. >> subplot(2,,); >> fplot('sin(x)',[0 2*pi]) >> subplot(2,,2); >> fplot('cos(x)',[0 2*pi]) Capítulo 2 pág. 2
0.5 0-0.5-0 2 3 4 5 6 0.5 0-0.5-0 2 3 4 5 6 Observaciones max(x) devuelve, si x es un vector, su coordenada máxima; ver help max para el resultado de este comando cuando x es una lista k-dimensional; min(x) funciona de manera análoga a max; abs(x) devuelve una lista del mismo tamaño que x cuyos elementos son los valores absolutos de los elementos de x; size(a) devuelve un vector k con el número de filas, columnas, etc. de la lista k-dimensional A; length(x) devuelve la longitud de x; save fname guarda las variables actuales en el fichero fname.mat; load fname carga las variables desde el fichero fname.mat; quit es la salida del sistema MATLAB Por ejemplo: >> x=[ 3-4 60-7 -3 2]; >> max(x) 60 >> min(x) -7 >> abs(x) 3 4 60 7 3 2 Un ejemplo: Integración numérica. La Integración Numérica consiste en calcular de manera aproximada una integral definida utilizando técnicas numéricas. Existe una amplia gama de métodos de Capítulo 2 pág. 3
integración numérica. En este ejemplo se muestran tres de ellos: la regla del rectángulo, la regla del trapecio y la regla de Simpson para calcular la integral:.- La regla del rectángulo. 2 ( x ) / dx 0 Un primer método, muy simple, de integración numérica consiste en aproximar la función f(x) sobre cada subintervalo por una constante y considerar el área del rectángulo de base h = x i+ - x i y altura f(x i ) para el i-ésimo intervalo. La integral se aproxima entonces por la suma de las áreas de los rectángulos así construidos. El intervalo de integración se dividirá en 2, 4, 8, 6, 32, 64 y 28 subintervalos. En primer lugar veremos el ejemplo con 2 subintervalos. Son necesarios, por tanto, tres puntos en el intervalo (0,). >> X=linspace(0,,3) X = 0 0.5000.0000 Los valores de la función x are se almacenan en la variable Y. >> Y=sqrt(-X) Y =.0000 0.707 0 La altura del primer rectángulo es f(0) por lo que guardamos la primera coordenada del vector Y. >> q=y() q = La altura del primer rectángulo es f() por lo que guardamos la segunda coordenada del vector Y. >> q=q+y(2) q =.707 Como la base de los rectángulos es 0.5, la suma de las áreas de los rectángulos se calcula multiplicando este valor por la suma de las alturas. >> q=q*/2 q = 0.8536 Con el fin de ampliar el número de subintervalos, gestionaremos los vectores a través de un bucle. Para dividir el intervalo en 28 subintervalos necesitamos 29 puntos. Capítulo 2 pág. 4
>> X=linspace(0,,29); Seguimos almacenando los valores de la función x en la variable Y. >> Y=sqrt(-X); >> q=y(); En este caso, la suma de las alturas va desde f(0) a f(27), es decir desde la primera coordenada Y() hasta Y(28). >> for j=:27 q=q+y(j+); end >> q=q*/28; Finalmente, el siguiente programa será utilizado para calcular la integral usando 2, 4, 8, 6, 32, 64 y 28 subintervalos: function rectanglerule=rectanglerule(y) q=zeros(7,); N=2; %Number of subintervals for i=:7 h=/n; q(i)=y(); for j=:n- q(i)=q(i)+y(j*(256/n)+); end q(i)=q(i)*h; N=N*2; end disp('approximations with the rectangle rule:') q La entrada de esta función es un vector cuyas coordenadas son los valores de la función a integrar en 256 puntos del intervalo [0,]. >> X=linspace(0,,257); >> Y=sqrt(-X); >> rectanglerule(y) Approximations with the rectangle rule: q = 0.85355339059327 0.76828304624275 0.7206302262445 0.694839687723 0.688393627894 0.67408333785 0.6704390729683 2. La regla del trapecio. En este ejemplo, hemos modificado el último programa para aproximar la integral por medio de la regla del trapecio. El programa modificado es el siguiente: function trapezoidalrule=trapezoidalrule(y) Capítulo 2 pág. 5
q=zeros(7,); N=2; %Number of subintervals for i=:7 h=/n; q(i)=0.5*y(); q(i)=q(i)+0.5*y(257); for j=:n- q(i)=q(i)+y(j*(256/n)+); end q(i)=q(i)*h; N=N*2; end disp('approximations with the trapezoidal rule:') q La entrada de esta función es un vector cuyas coordenadas son los valores de la función a integrar en 256 puntos del intervalo [0,]. >> X=linspace(0,,257); >> Y=sqrt(-X); >> trapezoidalrule(y) Approximations with the rectangle rule: q = 0.60355339059327 0.64328304624275 0.658302262445 0.663589687723 0.66555893627894 0.66627083785 0.66652565729683 3. La regla de Simpson. Finalmente, utilizaremos la regla de Simpson, modificando el programa anterior de la siguiente manera: function simpsonrule=simpsonrule(y) q=zeros(7,); N=2; %Number of subintervals for i=:7 h=/n; q(i)=y(); q(i)=q(i)+y(257); k=0; for j=:n- k=k+; q(i)=q(i)+4*y(k/2*(256/n)+); k=k+; q(i)=q(i)+2*y(k/2*(256/n)+); end k=k+; q(i)=q(i)+4*y(k/2*(256/n)+); %Last interval middle point. q(i)=q(i)*h/6; N=N*2; end disp('approximations with Simpson rule:') q Capítulo 2 pág. 6
La entrada de esta función es un vector cuyas coordenadas son los valores de la función a integrar en 256 puntos del intervalo [0,]. >> X=linspace(0,,257); >> Y=sqrt(-X); >> simpsonrule(y) Approximations with Simpson rule: q = 0.65652626479257 0.66307928008502 0.665398886285 0.66628827468 0.6665080307836 0.6666060593627 0.6666468462030 La siguiente tabla refleja los resultados de las tres aproximaciones realizadas: Número de subintervalos 2 4 8 6 32 64 28 Regla del Rectángulo 0.85355339059327 0.76828304624275 0.7206302262445 0.694839687723 0.688393627894 0.67408333785 0.6704390729683 Regla del Trapecio 0.60355339059327 0.64328304624275 0.658302262445 0.663589687723 0.66555893627894 0.66627083785 0.66652565729683 Regla de Simpson 0.65652626479257 0.66307928008502 0.665398886285 0.66628827468 0.6665080307836 0.6666060593627 0.6666468462030 Capítulo 2 pág. 7