Práctica 2: Aritmética de la máquina y Álgebra Lineal con MATLAB 1. 1.1. Aritmética de la máquina Introducción Recordemos que MATLAB realiza todos los cálculos siguiendo el estándar IEEE en punto flotante, aunque a partir de la versión 7 se admiten valores tanto en simple como en doble precisión. Por defecto (si no se especifica lo contrario), todo valor se considera de doble precisión, pero esto se puede indicar por medio de modificadores single y double. Por ejemplo, el épsilon de la máquina en doble precisión es M ≈ 10−16 , lo que se puede comprobar con el comando >> eps ans = 2.2204e-016 A su vez eps(’single’) nos devuelve ans = 1.1921e-007 Se pueden crear variables de simple o doble precisión por medio de los mismos comandos single y double: >> x=single(1/3); Podemos averiguar el tipo de variable usando la función class: >> class(x) ans = single El valor NaN (“Not-A-Number”) de MATLAB está en correspondencia con el estándar mencionado, y es producido por cualquier “indeterminación”: >> 0/0 ans = NaN Práctica de ordenador II 2 Una vez generado, es propagado a cualquier cálculo: >> 0*NaN ans = NaN 1.2. Trabajo de laboratorio Resuelva, con la ayuda de MATLAB, los siguientes problemas: 1. El mayor (respectivamente, menor ) número real positivo con representación normalizada es almacenado por MATLAB en la variable realmax (respectivamente, realmin). a) Compruebe que esos valores coinciden con los estudiados en teorı́a, tanto en simple como en doble precisión. b) ¿Qué valor espera obtener usted como resultado de cada una de las operaciones siguientes: 1.1*realmax, -2*realmax, eps*realmin, eps*realmin/2? Conteste primero y ejecute las operaciones después; interprete el resultado en cada caso. 2. MATLAB admite operaciones entre variables en punto flotante de precisiones diferentes. ¿Qué resultado cree usted que se obtiene al multiplicar un valor de doble y otro de simple precisión y por qué? Experimente creando una variable de doble y otra de simple precisión. 3. Analice el siguiente script (utilice la ayuda de MATLAB para los comandos nuevos): n=0; x=1; while x >0, x=x/2; n=n+1; fprintf(’2^(-%d) = %e \n’, n, x) end Ejecútelo e interprete el resultado. ¿Qué relación tiene con lo que obtuvo en el ejercicio anterior? 4. (Opcional): Modifique el script anterior, asignando en cada ciclo while el valor y=x+1 y haciendo que éste continúe mientras y > 1. Ejecútelo y mire para qué valor de x se ha detenido. Compare el resultado con el del ejercicio anterior y dé una interpretación del mismo. Andrei Martı́nez Finkelshtein Práctica de ordenador II 2. 2.1. 3 Álgebra Lineal Introducción A lo largo de la Práctica 1 hemos visto en particular cómo se crean las matrices (y vectores) y algunas operaciones básicas entre ellos. Ahora ahondaremos en algunos aspectos adicionales relacionados con el álgebra lineal. Muchas matrices especiales no es necesario especificar “a mano”, sino que tienen funciones predefinidas para crearlas; entre ellas están eye(m,n) devuelve la matriz m × n con 1 en la diagonal principal y 0 en las demás posiciones; en particular, ones(n) es la matriz identidad n × n; ones(m,n) devuelve la matriz m × n con 1 en todas las posiciones; en particular, ones(n) de unos n × n. De manera análoga funciona zeros(m,n) y zeros(n); rand(m,n) devuelve la matriz m × n con valores aleatorios uniformemente distribuidos en [0, 1]; en particular, rand(n) es la matriz aleatoria n × n. El comando randn(m,n) tiene una función análoga, excepto que los números obedecen a la distribución normal con media 0 y desviación estándar σ = 1; diag construye matrices diagonales o devuelve la diagonal de una matriz, en dependencia del contexto: • si v es un vector de n componentes, diag(v,k) devuelve una matriz cuadrada de orden n + |k|, con los elementos de v en la k-ésima diagonal: k = 0 (por defecto) representa la diagonal principal, k > 0 son las que están por encima, y k < 0 las que están por debajo de la diagonal principal. En particular, diag(v) crea una matriz diagonal con v en la diagonal principal. • si X es una matriz, diag(X,k) devuelve un vector columna, formado por los elementos de la k-ésima diagonal de X. En particular, diag(X) devuelve el vector (columna) de la diagonal principal de X. Además de las habituales (*,+,-), MATLAB incorpora diversas funciones para utilizar con matrices; entre ellas, inv calcula la inversa de una matriz; det calcula el determinante de una matriz; rank calcula el rango de una matriz. Andrei Martı́nez Finkelshtein Práctica de ordenador II 4 Por último, en MATLAB están definidas dos divisiones: izquierda y derecha, que aplicadas a matrices o vectores tienen el siguiente sentido: A/B ⇔ AB −1 , A\B ⇔ A−1 B . En realidad, son operaciones mucho más versátiles de lo que se explica aquı́, y que iremos descubriendo a lo largo del curso. 2.2. Trabajo de laboratorio Resuelva, con la ayuda de MATLAB, los siguientes problemas: 1. Escriba una función de MATLAB llamada menores, function [y]=menores(A,k) que tenga como variables A y k y que devuelva la submatriz cuadrada k × k de la matriz A correspondiente al menor principal de ese orden. 2. Recuerde que un criterio suficiente para que una matriz A sea definida positiva es que todos sus menores principales sean estrictamente positivos. Modifique la función menores del ejercicio anterior para que devuelva la lista de todos los menores principales de la matriz argumento. Use la función menores para verificar si las matrices 21 −13 −200 21 −13 2 −13 133 14 y −13 133 14 −200 14 5 2 14 5 son definidas positivas. 3. Defina la matriz 1/2 1/3 1/4 1/3 1/4 1/5 1/4 1/5 1/6 y ası́gnela a la variable B. Calcule también su inversa y ası́gnela a C. Realice la comprobación de la certeza del resultado. 4. Verifique si el siguiente sistema de ecuaciones es compatible: 3u + 4v − 6x + 5z = −8; 2u − 12v + z = 10; −u + v − 14x + y + z = 20; 10v + 10x − y − 3z = 6; 2u − 3v + y = −5; En caso de que lo sea, resuélvalo por dos vı́as: a) por medio de la división matricial (operador \); b) por medio de la inversa de la matriz. Andrei Martı́nez Finkelshtein