You are on page 1of 31

Pr acticas de An alisis Matricial.

Una Introducci on a MATLAB


Ion Zaballa

1.

Introducci on

Aunque desarrollado con mi propio lenguaje y motivaci on, el contenido e ideas de esta Introducci on a MATLAB est a sacadas de los Cap tulos 1 de los excelentes libros de Cleve Moler [1] y Charle van Loan [2]. El primero est a disponible por cap tulos separados totalmente gratis en la direcci on: http://www.mathworks.com/moler Esta introducci on a MATLAB tiene como objetivo que el/la estudiante se familiarice r apidamente con algunas de las muchas posibilidades que ofrece MATLAB para trabajar las matem aticas. La idea es presentar varios problemas que investigan algunos problemas elementales y al mismo tiempo, espero que, interesantes de matem aticas. Quienes tengan experiencia en otros lenguajes de programaci on enseguida apreciar an la potencia y sencillez de manejo de MATLAB estudiando estos ejemplos. Para todos, iniciados o no iniciados, se ha confeccionado una Gu a b asica de MATLAB para el Curso de An alisis Matricial, disponible en la misma p agina web en la que est a esta introducci on. Pero para quienes esta sea la primera vez que tienen contacto con un lenguaje de programaci on, hay multitud de manuales on-line y MATLAB, propiamente, dispone de una gu a de ayuda para empezar a trabajar: Ejercicio 1 Pinchando en Help en el men u principal y seleccionando Product Help aparecer a una nueva ventana con toda la ayuda de MATLAB. En la parte izquierda aparece un men u que se puede desplegar pinchando en el s mbolo . Utilizando esta t ecnica t omate unos minutos para familiarizarte con este sistema de ayuda. Por ejemplo, despliega los siguientes men us: MATLAB Getting Started Matrices and Arrays Matrices and Magic Squares y lee los documentos que aparecen all : About Matrices, Entering Matrices, sum,transpose and diag, Subscripts, The Colon Operator y The magic Function. Est an ordenados, de forma que se entiende mejor su contenido si se leen en el orden especicado. Ejercicio 2 T omate otros pocos minutos para ver una de las demos que vienen con MATLAB. Se accede a ellas a trav es del men u Help que aparece en el men u principal tanto de la ventana de comandos como de la de ayuda. Una demostraci on recomendable es Basic Matrix Operations que aparece al seleccionar Mathematics en el men u principal. 1

Ejercicio 3 .- Utiliza helpwin para echar un vistazo a las funciones matem aticas elementales de MATLAB.

Figura 1: El rect angulo aureo.

2.

La raz on aurea

Para ir aprendiendo algunos comandos de MATLAB vamos a tomar como disculpa la raz on aurea. Se trata de una pr actica dirigida en la que debes ir haciendo lo que se indica para familiarizarte con algunos comandos b asicos de MATLAB. La raz on aurea aparece en muchas partes de la matem atica y aqu veremos unas pocas. La raz on aurea toma su nombre del react angulo aureo que se muestra en la Figura 1. Este tiene la propiedad caracter stica siguiente: al suprimir un cuadrado unidad se obtiene un rect angulo menor con las mismas proporciones que el original. Es decir, 1 1 = . 1 La raz on aurea es el lado de tal rect angulo. Debe ser entonces la ra z cuadrada positiva de la siguiente ecuaci on de segundo grado 2 1 = 0 . Las dos soluciones de esta ecuaci on son 1 5 = 2

Ejercicio 4 Asigna el valor positivo a la variable phi y calcula el valor en formato short y long.(Indicaci on: Puedes utilizar el comando help format para consultar la ayuda sobre los posibles formatos en que se presentan los n umeros). 2

Se puede usar MATLAB para hallar las ra ces de un polinomio. MATLAB representa los polinomios como un vector: el de sus coecientes. As , el vector >> p=[1 -1 -1] representa el polinomio p(x) = x2 x 1 Las ra ces se calculan mediante la funci on roots: >> r=roots(p) produce r = -0.61803398874989 1.61803398874989 Ejercicio 5 Compru ebalo. Hay muchas formas de calcular la raz on aurea con MATLAB. Una de ellas es denir la funci on f (x) = 1 (x 1) x

y calcular sus ceros. Para denir una funci on a partir de la versi on 7 de MATLAB se puede utilizar el siguiente c odigo >> f=@(x)1/x-(x-1) As queda denida f como funci on de x. Se pueden denir funciones de varias variables. Por ejemplo >> f=@(x,y)y/x-(x-y) denir a f como funci on de las variables x, y . Y >>f(2,1) devuelve el valor de f en el punto (2,1). Ejercicio 6 Escribe los comandos anteriores y comprueba los resultados. 3

1 Supongamos que tenemos denida la funci on f (x) = x (x 1). Queremos calcular las ra ces de esta funci on. Para ello necesitamos una estimaci on de donde pueden estar aproximadamente. Una forma de obtener esta aproximaci on es dibujar la gr aca de esta funci on. El comando ezplot lo hace

>> ezplot(f,0,4)
1/x(x1)

7 6 5 4 3 2 1 0 1 2 3 0 0.5 1 1.5

2 x

2.5

3.5

Figura 2: Gr aca de la fucni on f (x) =

1 x

(x 1).

produciendo la Figura 2 sin el c rculito que marca el cero de la funci on f . Los argumentos 0 y 4 especican el intervalo (0, 4) en el que se dibuja la gr aca. N otese que f tiene una as ntota vertical en x = 0. En la gr aca se aprecia que f tiene un cero entre 1 y 2. Poniendo >> phi=fzero(f,1.5) se obtiene phi = 1.61803398874989 que es una aproximaci on a la raz on aurea tan buena como se podr a desear. Los comandos >> hold on >> plot(phi,0,o) sirven para colocar un circulito en en la posici on (, 0) en la misma gura donde se hab a dibujado la curva (ver la Figura 2).

Ejercicio 7 Escribe los comandos anteriores y comprueba los resultados. Usa la ayuda (help hold, help plot) para saber lo que hacen dichas ordenes. A continuaci on escribiremos el programa de MATLAB que produce la Figura 1. Pero antes de hacerlo conviene tener en cuenta lo siguiente: un programa de MATLAB es un chero con la extensi on .m que contiene varias l neas de comandos v alidos de MATLAB y que se ejecutan sucesivamente. Enseguida veremos un ejemplo. La distribuci on de MATLAB instalada en el ordenador tiene cientos o miles de tales programas. El Cap tulo 4 de la Gu a est a dedicado a la programaci on en MATLAB y el objetivo de las pr acticas de este curso es llegar a confeccionar algunos programas interesantes en el lenguaje de MATLAB. En el Cap tulo 3 se explican algunos conceptos previos necesarios para que MATLAB interact ue correctamente con los programas que vayas creando. Esto es un peque no resumen. MATLAB necesita conocer de antemano los directorios donde se encuentran los programas que quieres ejecutar. Si los programas vienen en la distribuci on, no hay problema, ya sabe donde buscarlos. Pero no tiene por qu e saber donde se encuentran los programas confeccionados por cada usuario; as que este tiene tres opciones: (a) ponerlos en la carpeta que utiliza MATLAB por defecto. Esto puede cambiar de una versi on a otra y de un sistema operativo a otro. En el momento actual Windows guarda, por defecto, los cheros de los usuarios en la carpeta MATLAB de Mis Documentos. (b) colocarlos en una carpeta personal (incluyendo un l apiz de memoria o disquete) y a nadir esta carpeta personal al MATLAB search path, y (c) colocarlos en una carpeta personal y cambiar el directorio de trabajo (ventana superior izquierda) a dicha carpeta personal. En tu propio ordenador personal cualquiera de las tres opciones es buena, pero en los ordenadores de la Facultad, en los que muchas personas diferentes pueden usar MATLAB, no tienes garant as de que un programa dejado en una carpeta del ordenador vaya a encontrarse all la siguiente vez que lo necesites. Es conveniente, por lo tanto, que cada cual venga provisto de un disquete o l apiz de memoria para almacenar all tus programas. Por el momento comprueba que est as en la capeta MATLAB de Mis Documentos, y si no, cambia a ella. Si no sabes c omo hacerlo preg untalo. En la ventana de comandos de MATLAB escribe (es muy importante que no te olvides de la extensi on .m porque es la forma en que MATLAB sabe que se trata de un chero ejecutable): >> edit rectaureo.m Se abrir a, en otra ventana, el editor de MATLAB. Escribe en el las siguientes l neas: %RECTAUREO Rect angulo aureo % RECTAUREO dibuja el rect angulo aureo. 5

phi = (1+sqrt(5))/2; x = [0 phi phi 0 0]; y = [0 0 1 1 0]; u = [1 1]; v = [0 1]; plot(x,y,b,u,v,b--); text(phi/2,1.05,\phi); text((1+phi)/2,-.05,\phi - 1); text(-.05,.5,1); text(.5,-.05,1); axis equal; axis off; set(gcf,color,white); A continuaci on s alvalo. En el directorio de trabajo debe aparecer ahora el chero rectaureo.m. Este es un ejemplo t pico de lo que en MATLAB se llama un script (gui on, en traducci on literal al castellano). Los script son cheros con la extensi on .m que contienen una serie de comandos de MATLAB. Cuando escribimos el nombre del chero (sin extensi on) en la ventana de comandos se ejecutan sucesivamente las l neas del chero. Observa que despu es de cada comando en el chero rectaureo.m hemos puesto ; porque no queremos que los resultados aparezcan en la ventana de comandos; s olo queremos que aparezca la gura. Ahora, en la ventana de comandos de MATLAB escribe: >> rectaureo MATLAB ejecutar a todos los comandos escritos en el chero y aparecer a la Figura 1 en una nueva ventana. Ejercicio 8 Trata de adivinar lo que hace cada una de las l neas del programa y, una vez que lo hayas conseguido (usando la ayuda o preguntando, si es necesario), responde a las siguientes cuestiones: En los pa ses europeos la medida est andar del papel es DIN A4. Sus dimensiones son: 210 mm de ancho y 297 mm de largo. La raz on entre estas dos cantidades no es la raz on aurea pero es pr oxima a otro n umero irracional. Cu al?. Si divides por la mitad una hoja DIN A4 cu al es la raz on entre las dimensiones de cada una de las mitades? Modica el chero rectaureo.m para ilustrar esta propiedad.

Ejercicio 9 Escribe un programa que se llame circunferencia.m que produzca la Figura 3. La raz on aurea se puede obtener como una fracci on continua; i.e. una expresi on de la forma a0 + 1 a1 +
1 a2 + a
1 3 +

0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1 0.5 0 0.5 1

u 60o

Figura 3: Circunferencia de radio 1 En efecto, resulta que si todos los ai son iguales a 1 obtenemos : =1+ 1 1+
1
1 1+ 1+

Esto permite confeccionar una funci on de MATLAB que genera y eval ua la fracci on continua truncada al n umero de fracciones que se desee. Abre un editor y escribe lo que viene a continuaci on. Una vez escrito, gu ardalo con el nombre fracaurea.m. function fracaurea(n) %FRACAUREA Fraccion continua para la razon aurea. % FRACAUREA(n) presenta n terminos de la fraccion continua % y varias formas de evaluar la razon aurea. p = 1; for k = 1:n p = [1+1/( p )];%Se debe dejar un espacio enter y p y entre p y end p p = 1; q = 1; for k = 1:n s = p; p = p + q; q = s; end p = sprintf(%d/%d,p,q) format long 7

p = eval(p) format short err = (1+sqrt(5))/2 - p Uno de los objetivos de este curso es llegar a escribir algunas funciones y scripts en el lenguaje de programaci on de MATLAB. Es importante que leas atentamente el Cap tulo 4 de la Gu a; en particular, la secci on 4.2. En cualquier caso vamos a analizar un poco esta funci on. Todas las funciones de MATLAB son cheros con la extensi on .m y empiezan con la palabra function. Esta es una de las diferencias con los scripts. Otra diferencia es que, suelen recibir valores (en este caso n) y, aunque no es el caso de esta funci on, tambi en suelen devolver valores (enseguida veremos un ejemplo de funci on que cumple estos dos requisitos). Y una tercera diferencia muy importante es que las variables de las funciones son locales mientras que las de los scripts son globales. Es decir, las variables en las funciones se almacenan en la memoria mientras se ejecuta la funci on; una vez terminada esta desaparecen de la memoria del ordenador. Para los scripts sin embargo, las variables se mantienen en la memoria con el valor que toman en el script hasta que es sustitu do por otro valor o se cierra MATLAB. Es decir, las variables de los scripts act uan como si se ejecutaran en la ventana de comandos. Analicemos esta funci on un poco. En primer lugar escribimos >> fracaurea(6) en la ventana de comandos de MATLAB. La respuesta es p = 1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1))))))

p = 21/13

p = 1.61538461538462

err = 0.0026 Las tres ps son diferentes formas de representar la misma aproximaci on a . 8

La primera p es la fracci on continua truncada a 6 t erminos. Se produce de la siguiente forma: se le asigna a la variable p el valor 1. Las tildes son importantes. Es la forma de decirle a MATLAB que se trata de una variable de tipo string, cadena de caracteres. De esta forma, al principio p es el string 1. Luego entramos en un bucle for ...end que repetidamente inserta los strings 1+1/( y ) por delante y por detr as, respectivamente, del string almacenado en p. Independientemente de lo largo que este string llegue a ser, es una expresi on v alida en MATLAB. Finalmente, el comando p (sin ;) muestra el valor de p al salir del bucle. El segundo p es la fracci on ordinaria que produce el truncamiento de la fracci on continua despu es de 6 t erminos. Puede no parecerlo, pero si observamos que 1+ 1
p q

p+q p

enseguida nos daremos cuenta de que empezando con los valores p = q = 1 (i.e., con la fracci on 1 ) y reemplazando la fracci o n 1 p q por p+q p obtenemos el valor de la fracci on continua truncada al t ermino deseado. Finalmente el comando p = sprintf(%d/%d,p,q) escribe la fracci on obtenida en la forma p/q con p y q en formato de n umero decimal (aunque en este caso sean enteros). Debe notarse que despu es de p = sprintf( %d/ %d,p,q), la variable p vuelve a ser un string. El tercer p es el valor num erico del segundo p obtenido usando el comando eval. Esta funci on devuelve el valor num erico de un string formado por una operaci on v alida para MATLAB. Por ejemplo, los comandos >> A=rand(2); >> s=det(A); >> eval(s) producir an el valor del det(A) (aunque, claro, esta es una forma muy tonta de calcularlo). En el caso que estamos considerando, el segundo p es el string 21/13. Al hacer eval(p) se calcula el valor de la fracci on 21 umero decimal. 13 y se escribe como n Todo lo anterior nos ha servido para aprender algunas funciones de MATLAB pero se podr a haber obtenido el mismo resultado de forma m as r apida. El c odigo p = sprintf(%d/%d,p,q) format long p = eval(p) 9

se podr a haber sustitu do por format rat p=p/q format long p De esta forma p ser a siempre una variable num erica, primero en formato racional, y despu es, en formato decimal. Finalmente la cantidad err es la diferencia entre p y ; es decir, el error absoluto de la estimaci on. Con 6 t erminos, la aproximaci on tiene menos de 3 d gitos de precisi on. Ejercicio 10 Cu antos t erminos se necesitar an para conseguir una precisi on de 10 d gitos? Y para que el error sea cero? Qu e pasa, entonces, (te oricamente y en la pr actica) si aumentas el n umero de t erminos?

3.

N umeros de Fibonacci

La raz on aurea aparece en muchos lugares de forma que podr a considerarse misteriosa. Un ejemplo son los n umeros de Fibonacci. En un libro publicado en 1202, Liber Abaci, Leonardo Pisano Fibonacci propuso el siguiente problema: Un hombre coloca un par de conejos en un lugar rodeado por un muro de forma que queden completamente aislados. Este par de conejos y los sucesivos que vayan naciendo engendran un nuevo par cada mes a partir del segundo mes de vida. Cu antos conejos habr a al cabo de un a no? Si no se pusiera la condici on de que los conejos no son productivos hasta el segundo mes, la respuesta ser a sencilla y no habr a habido n umeros de Fibonacci. Si cada par de conejos engendrara otro par cada mes, el n umero de estos se duplicar a cada mes; y al cabo de n meses n habr a 2 conejos. Pero la condici on de que s olo se pueden producir nuevos pares de conejos a partir del segundo mes de vida, hace que el problema sea m as interesante. Si fn representa el n umero de pares de conejos despu es de n meses, este n umero debe ser igual al n umero de conejos en el mes anterior fn1 m as el de conejos que ha producido una nueva pareja (que son los que hab a un mes antes, fn2 ). As fn = fn1 + fn2 Los dos primeros meses habr a f1 = 1 y f2 = 2 pares de conejos, respectivamente. Con estos datos podemos producir una funci on de MATLAB que nos proporcione la secuencia de Fibonacci con tantos t erminos como queramos. Usa el editor para escribirla y salvarla con el nombre de fibonacci.m 10

function f = fibonacci(n) %FIBONACCI secuencia de Fibonacci % f = FIBONACCI(n) genera los primeros n n umeros de Fibonacci. f = zeros(n,1); f(1) = 1; f(2) = 2; for k = 3:n f(k) = f(k-1) + f(k-2); end Esta ya es una funci on t pica de MATLAB. Es conveniente y altamente aconsejable que el nombre del chero que usas para escribir esta funci on (en este caso fibonacci.m) coincida con el nombre de la funci on. Debes tener en cuenta que si llamas a la funci on escribiendo su nombre en la l nea de comandos, MATLAB buscar a un chero con ese nombre. Por lo tanto, si el nombre de la funci on y del chero no coinciden, no obtendr as el resultado que deseas. fibonacci es una verdadera funci on de MATLAB, sencilla, pero con todos los ingredientes: empieza con la palabra function, admite datos de entrada: n, y produce una salida: f, que es un vector. La funci on dene primero un vector (matriz) de tama no n 1 con todas sus componentes iguales a 0. A continuaci on cambia la primera componente a 1 y la segunda a 2 iniciando la secuencia de Fibonacci. Despu es entramos en un bucle para sustituir las restantes componentes del vector f . Entre el nombre de la funci on y los comandos que la componen hay dos (o m as) l neas que comienzan por el s mbolo %. Son l neas de comentarios que sirven para orientar a quien use la funci on sobre lo que esta realiza. Si una vez escrita la funci on y salvado el chero escribimos >> help fibonacci en la ventana de comandos, obtendremos FIBONACCI secuencia de Fibonacci f = FIBONACCI(n) genera los primeros n n umeros de Fibonacci. Esta informaci on es muy u til para los posibles usuarios de la funci on. Es muy buena costumbre colocar un par de l neas de comentarios para ayudarnos a nosotros mismos y a los dem as. Veamos ahora la salida que produce la funci on. Si escribimos >> g=fibonacci(12) obtendremos g =

11

1 2 3 5 8 13 21 34 55 89 144 233 La salida de la funci on, que es un vector, se ha almacenado en la variable g, que ahora contiene los 12 primero t erminos de la sucesi on de Fibonacci. Por lo general, no necesitaremos todos los datos del vector, quiz a s olo unos pocos, o ni tan siquiera eso: quiz a s olo queramos tener el vector con los datos para usarlo posteriormente. Por ejemplo, si hacemos >> g=fibonacci(12); No hay respuesta visible por parte de MATLAB, pero en g est a el vector con los 12 primeros n umeros de la sucesi on de Fibonacci. Aunque no lo parezca estos est an relacionados con , la raz on aurea. Veamos, escribamos >> format rat >> g(7)/g(6) La respuesta es ans = 21/13 Este n umero nos resulta familiar: es el n umero que produc a fracaurea(6). Es una casualidad?. Ejercicio 11 Comprueba para varios valores de n (no mayores que 40, por qu e?) que la fracci on que se obtiene como resultado de fracaurea(n) coincide con el valor de f(n+1)/f(n) donde f es el vector que devuelve fibonacci(n+1). Esto hace plausible el siguiente resultado que es, en efecto, verdadero fn+1 = . n fn l m 12

4.

Cuadrados M agicos

Aunque en la actualidad MATLAB puede considerarse un software de prop osito general, naci o con el objetivo de proporcionar un entorno de trabajo para el c alculo num erico con vectores y matrices. De ah su nombre que proviene de Matrix Laboratory. Los cuadrados m agicos proporcionan un conjunto interesante de ejemplos de matrices. Si escribimos >> help magic obtenemos MAGIC Magic square. MAGIC(N) is an N-by-N matrix constructed from the integers 1 through N^2 with equal row, column, and diagonal sums. Produces valid magic squares for all N > 0 except N = 2. Los cuadrados m agicos eran conocidos en China 2000 a nos antes de nuestra era, y el cuadrado m agico de orden 3 se conoce con el nombre de Lo Shu. Cuenta la leyenda que fu e descubierto en el caparaz on de una tortuga en el r o Lo en el siglo 23 antes de Cristo. Hay cantidad de mitolog a y esoterismo asociado a los cuadrados m agicos. Una r apida consulta en Google proporciona un sin n de p aginas relacionadas con los cuadrados m agicos. Tal y como dice la ayuda de magic este comando proporciona un cuadrado m agico de cualquier orden, salvo de orden 2. Por ejemplo, Lo Shu se consigue de la siguiente forma: >>A=magic(3) que produce A = 8 3 4 El comando >> sum(A) devuelve un vector cuya i- esima componente es la sumas de los elementos de la i- esima columna: ans = 15 1 5 9 6 7 2

15

15

Para obtener la suma de los elementos en cada la podemos usar el mismo comando sobre la transpuesta: 13

>> sum(A) ans = 15 15 15 Para sumar los elementos de la diagonal principal (elementos en la posici on (i, i)): >> sum(diag(A)) ans = 15 El comando flipup pasa la primera la a la u ltima, la segunda a la pen ultima y as sucesivamente. Si queremos comprobar que la contradiagonal (elementos en la posici on (i, n i + 1)) tambi en suman lo mismo podemos utilizar el comando >> sum(diag(flipud(A))) ans = 15 El mismo efecto habr amos conseguido con el comando fliplr que hace lo mismo que flipud pero por columnas. Todo lo anterior certica que A es un cuadrado m agico. Pero por qu e la suma es 15?. El comando >> sum(1:9) ans = 45 nos permite observar que la suma de los primeros 9 n umeros enteros positivos es 45. Como estos est an colocados en A de tres en tres y sumando siempre lo mismo, la suma de cada la, columna, etc. debe ser 15. Hay 8 formas posibles de colocar una transparencia en un retroproyector (no olvidemos que una transparencia se puede leer por delante y por detr as). De la misma forma hay 8 maneras posibles de escribir el mismo cuadrado m agico de orden 3 que corresponden a las posibles formas de rotar y reejar el cuadrado. Se pueden obtener mediante los siguientes simples comandos que se explican por s solos: >> for k=0:3 rot90(A,k) rot90(A,k) end

14

Ahora un poco de algebra lineal: >> det(A) ans = -360 nos da el determinante, >> X=inv(A) X = 0.1472 -0.0611 -0.0194

-0.1444 0.0222 0.1889

0.0639 0.1056 -0.1028

nos da la inversa, aunque se aprecia mejor si usamos el formato racional >> format rat >> X X = 53/360 -11/180 -7/360

-13/90 1/45 17/90

23/360 19/180 -37/360

Volvemos al formato decimal para calcular la norma espectral, los valores propios y los valores singulares de A: >> format short >> r=norm(A),e=eig(A),s=svd(A) r = 15 e = 15.0000 4.8990 -4.8990 s = 15.0000 6.9282 3.4641 La suma m agica, 15, aparece en los tres casos porque el vector (1, 1, 1) es vector propio y vector singular a izquierda y derecha de A. En el grabado La Melancol a de Albrecht Durero aparece, entre otros objetos matem aticos, un cuadrado m agico de orden 4. La distribuci on de MATLAB contiene una copia electr onica de este cuadro. Se encuentra en el chero durer.mat. Carguemos los datos del chero: 15

>> load durer Ahora veamos las variables que contiene. El comando whos devuelve las variables que han sido denidas en una sesi on. Es posible que tengas otras variables, aparte de las denidas al cargar el chero durer.mat, de modo que lo que aparece a continuaci on puede ser s olo parte de lo que se muestra en tu ventana de comandos. >> whos Name X caption map

Size 648x509 2x28 128x3

Bytes 2638656 112 3072

Class double char double

Attributes

Hay libros especializados en c omo MATLAB maneja los colores y las im agenes, pero no estudiaremos este asunto aqu . Como curiosidad veamos c omo conseguir el grabado La Melancol a. Los tres siguientes comandos lo proporcionan: >> image(X) >> colormap(map) >> axis image Puedes teclearlo uno a uno para ver lo que vas obteniendo. Hay una lupa en la barra de herramientas, util zala para agrandar un cuadrado que se aprecia debajo de la campana. Observar as una matriz 4 4. Quiz a no la distingas muy bien. MATLAB tiene otro chero, detail.mat, en el que est an los datos de ese detalle del grabado con mucha mejor resoluci on. Los siguientes comandos te proporcionan la imagen: >> load detail >> image(X);colormap(map);axis image; Se trata de un cuadrado m agico, pero no el que produce MATLAB con el comando magic(4): >> A=magic(4) A = 16 2 5 11 9 7 4 14

3 10 6 15

13 8 12 1

El de Durero se obtiene de este permutando las columnas segunda y tercera: >> A=A(:,[1 3 2 4]) 16

A = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1

Al permutar dos las o dos columnas se puede destruir la magia del cuadrado, pero casualmente en este caso no. En efecto, las diagonales siguen sumando 34 (la sumas de las y columnas, por supuesto, no se modican). Probablemente Durero escogi o este cuadrado m agico porque juntado las cifras de los dos n umeros que est an en el centro de la u ltima la se consigue el n umero 1514, que fu e el a no en que Durero hizo el grabado. Hemos visto dos cuadrados m agicos diferentes de orden 4; hay 880. Y de orden 5, 275305224. No se sabe cu antos hay de orden 6 o m as. Curiosamente, o no, para nuestros cuadrados m agicos de orden 4 tenemos que det(A) = 0. Y si intentamos calcular la inversa obtenemos >> inv(A) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 9.796086e-18. ans = 1.0e+15 * 0.1251 -0.3753 0.3753 -0.1251 0.3753 -1.1259 1.1259 -0.3753 -0.3753 1.1259 -1.1259 0.3753 -0.1251 0.3753 -0.3753 0.1251

Ya veremos el signicado del mensaje obtenido. En cualquier caso, esto nos indica que hay cuadrados m agicos que son matrices singulares (no invertibles) cu ales?. El siguiente c odigo produce una tabla de dos columnas, en la primera se coloca el orden del cuadrado m agico producido por MATLAB y en la segunda su rango: >> for n=1:24; r(n)=rank(magic(n));end; [(1:24) r] ans = 1 1 2 2 3 3 4 3 5 5 6 5 7 7 8 3 9 9 10 7 17

11 12 13 14 15 16 17 18 19 20 21 22 23 24

11 3 13 9 15 3 17 11 19 3 21 13 23 3

Observa cuidadosamente esta tabla, ignorando el caso n = 2 que no es un cuadrado m agico.Observas alguna regla?. Quiz a un diagrama de barras puede ayudarte(Figura 4): >> bar(r); title(Rango de los cuadrados magicos)
25 20 15 10 5 0 0 Rango de los cuadrados magicos

10

15

20

25

Figura 4: Rango de los cuadrados m agicos producidos por MATLAB Ejercicio 12 A=magic(4) es singular; i.e., sus columnas son linealmente dependientes. Los siguientes comandos te informan sobre c omo es esa dependencia: null(A), null(A,r), rref(A). Qu e informaci on te proporcionan? Ejercicio 13 Sea A=magic(n) para n=3,4,5. qu e efecto producen los comandos >> p=randperm(n);q=randperm(n);A=A(p,q); sobre sum(A),sum(A),sum(diag(A)),sum(diag(flipud(A))),rank(A)? 18

5.

Procesos Aleatorios

Muchas simulaciones que se realizan para predecir el comportamiento de objetos involucran procesos aleatorios. El ejemplo que veremos m as abajo es el siguiente: Supongamos que queremos obtener una estimaci on del n umero . Podr amos idear un proceso aleatorio cuya probabilidad est e relacionada con el n umero . Una posibilidad es la siguiente: Cu al es la probabilidad de que al lanzar un dardo, sin apuntar, a una diana redonda inscrita en un cuadrado (Figura 5) acertemos en la diana y no en la supercie del cuadrado exterior a la misma? Sencillamente la
1.5

0.5

0.5

1.5 1.5

0.5

0.5

1.5

Figura 5: Una diana. relaci on entre las areas de ambas guras geom etricas. Si el cuadrado lo pensamos centrado en el punto (0, 0) y de lado 2, la circunferencia tendr a radio 1 y tal probabilidad es . 4 Con un ordenador podemos simular el lanzamiento de un dardo a la diana: cada lanzamiento es asociado a la elecci on aleatoria de un par de n umeros (x, y ) comprendidos entre 1 y 1. Este punto representar a el punto del cuadrado donde se ha clavado el dardo. Realizando esta simulaci on un n umero muy alto de veces la frecuencia relativa de elecci on de puntos en el interior del c rculo se deber a aproximar a la probabilidad buscada: N umero de lanzamientos en el interior del c rculo 4 N umero total de lanzamientos

El punto clave en esta simulaci on es el de la elecci on aleatoria del par de puntos que determinan las coordenadas del cuadrado. Todos los puntos deber an tener la misma probabilidad de ser elegidos; y esto nos indica que los n umeros aleatorios que los determinan deben estar uniformemente distribuidos. MATLAB proporciona, mediante el uso repetido del comando rand una sucesi on de puntos uniformemente distribu dos entre 0 y 1. C omo es generada tal sucesi on no es un problema trivial, pero se puede modicar el comienzo de la misma con el comando rand(seed,n) con n un n umero entero positivo. 19

Tambi en se pueden obtener n umeros aleatorios normalmente distribu dos. El comando que lo hace es randn. El siguiente script puede servir para comprender la diferencia entre ambos tipos de n umeros aleatorios: close all clc subplot(2,1,1) x=rand(1000,1); hist(x,30) axis([-1 2 0 60]) title(Distribuci on de los valores en rand(1000,1)) xlabel(sprintf(Media= %5.3f. Mediana=%5.3f., mean(x),median(x))) subplot(2,1,2) x=randn(1000,1); hist(x,linspace(-2.9,2.9,100)) title(Distribuci on de los valores en randn(1000,1)) xlabel(sprintf(Media= %5.3f. Desviacion standard=%5.3f., mean(x),std(x))) Ejercicio 14 Copia este script en un chero con el nombre randhisto.m y ejec utalo. Trata de comprender lo que hace cada comando. Ejercicio 15 .- Para apreciar, de otra forma, la diferencia entre la distribuci on uniforme y la normal escribe un script que haga lo siguiente: 1.- Escoja aleatoriamente 10000 pares de puntos, primero con distribuci on uniforme y despu es con distribuci on normal. 2.- Haga dos gr acas, cada una de ellas dibujando todos los puntos escogidos de cada una de las dos formas. 3.- Ponga un t tulo signicativo en cada gr aca. 4.- Los ejes de la primera gr aca deben estar entre 0 y 1; y los de la segunda entre -3 y 3. Una vez que entendemos mejor la diferencia entre los comandos rand y randn, podemos volver a nuestra simulaci on para el c alculo aproximado del n umero . Vamos a escribir una funci on que produzca la simulaci on del lanzamiento de los dardos. Recordemos que la parte importante es la selecci on aleatoria de un par de puntos (x, y ) en el interior del cuadrado (por lo tanto, con distribuci on uniforme) y la determinaci on de si tal punto est a o no en el interior del c rculo. La funci on admite un n umero entero positivo function pi=dardos(n) %DARDOS es una funci on para calcular el numero pi % usando un m etodo de Montecarlo

20

%DARDOS admite un n umero entero n que es el n umero de %cientos de lanzamientos y devuelve una %aproximaci on a pi y la gr afica de la convergencia a %pi del m etodo if (ceil(n)-n ~= 0 || n<0) error(n debe ser entero); return else close all; clc rand(seed,0); ndentro=0; piestimada=zeros(n,1); for k=1:n x=-1+2*rand(100,1);y=-1+2*rand(100,1); ndentro=ndentro+sum(x.^2+y.^2<=1); piestimada(k)=(ndentro)/(100*k)*4; end plot(piestimada) pi=piestimada(n); title(sprintf(Valor estimado de pi= %5.6f,pi)); xlabel(Cientos de lanzamientos); end La ejecuci on de esta funci on con n = 500 (esto es, 50000 lanzamientos) produce el valor de = 3,1302 y la Figura 6. Debe observarse que el valor estimado de mejora gradualmente a
3.26 3.24 3.22 3.2 3.18 3.16 3.14 3.12 3.1 3.08 Valor estimado de pi= 3.157

50

100

150

200 250 300 Cientos de lanzamientos

350

400

450

500

Figura 6: Una estimaci on de de tipo Montecarlo. medida que n aumenta, pero que el progreso hacia 314159 no es ni estable ni, mucho menos, r apido. Simulaciones de este tipo se conocen con el nombre de Montecarlo (o Monte Carlo). 21

Hay una sentencia en el programa que merece atenci on especial: sum(x.^2+y.^2<=1). x y y son vectores de 100 componentes cada uno y x.^2 eleva cada componente de x al cuadrado (y lo mismo y.^2). Ahora, x.^2+y.^2 es un vector cuyas componentes son la suma de los cuadrados de las componentes de x y de y. Finalmente, x.^2+y.^2<=1 tambi en es un vector: sus componentes son 0 o 1. Es 0 si la correspondiente componente no cumple la condici on y 1 si la cumple. Por lo tanto, sum((x.^2+y.^2<=1) cuenta el n umero de componentes del vector x.^2+y.^2 que son menores que 1; es decir, el n umero de dardos que han impactado en el interior del c rculo. Otros dos comandos u tiles para trabajar con vectores de ceros y unos son any y all. any(x) devuelve un 1 (true) si alguna componente de x es distinta de cero; si no devuelve un 0 (false). Y all(x) devuelve un 1 si todas las componentes de x son distintas de cero; si no devuelve un cero. Si x es una matriz, any y all act ua por columnas. As >> x=[ 0 1 0; 1 -1 0; -1 1 0] x = 0 1 0 1 -1 0 -1 1 0 >> any(x) ans = 1 1 0 >> all(x) ans = 0 1 0 Ejercicio 16 Cu al es la probabilidad (aproximadamente) de que el polinomio cuadr atico p(x) = 2 ax + bx + c tenga ra ces complejas sabiendo que los coecientes a, b y c son variables aleatorias con distribuci on uniforme (0, 1)? Y si lo son con distribuci on normal (0, 1)?. Se trata de fabricar una funci on que lo simule.

6.

Aritm etica en punto otante

Dado que los ordenadores utilizan un n umero nito de bits para representar los n umeros reales, s olo pueden representar un n umero nito de ellos; es decir, un subconjunto nito de n umeros reales (o de n umeros complejos). Esta limitaci on conlleva dos dicultades: Los n umeros representados no pueden ser arbitrariamente grandes (en valor absoluto). Debe haber agujeros entre ellos. Lo primero conduce a los fen omenos conocidos con los nombres de overow y underow (rebosamiento por arriba o por abajo) y lo segundo produce el roundo (redondeo). Por lo general, es posible usar MATLAB sin preocuparse de estas cuestiones, pero de vez en cuando

22

puede que nos encontremos con problemas que un somero conocimiento del funcionamiento de la aritm etica en punto otante puede ayudar a solucionar. Hace 20 a nos la situaci on era mucho m as complicada de lo que es ahora porque cada ordenador ten a su propio sistema de n umeros en punto otante. Algunos eran binarios, otros decimales. Incluso hubo algunos ordenadores rusos que usaban aritm etica ternaria. Adem as, entre los binarios los hab a que usaban aritm etica de base 2, otros octal o hexad ecimal. Y cada uno ten a su propia precisi on. En 1985 la IEEE Standard Board y el American National Standard Institute decidieron adoptar para la aritm etica binaria de punto otante lo que se conocce como el ANSI/IEEE Standard 754-1985. Esta decisi on fue la culminaci on del trabajo de casi una d ecada de trabajo de un grupo de 92 personas integrado por matem aticos, ingenieros e inform aticos procedentes de universidades y empresas dedicadas a la construcci on de ordenadores y microprocesadores. Todos los ordenadores dise nados a partir de 1985 usan la aritm etica IEEE de punto otante. Esto no signica que todos ellos producen los mismos resultados porque hay una cierta exibilidad en la norma ANSI/IEEE, sino que el modelo de funcionamiento de la aritm etica en punto otante es, hoy en dia, independiente del ordenador que se utilice. MATLAB ha usado siempre el formato IEEE de doble precisi on. Hay un formato de precisi on simple que salva espacio pero que no supone una mejora en la velocidad con los ordenadores actuales. Nosotros hablaremos s olo de la precisi on doble. Para entender bien este concepto debemos recordar la forma en la que los ordenadores umeros en punto otante. trabajan con los n La mayor a est an normalizados. Si calculamos 1/ 120 en una calculadora de bolsillo con notaci on cient ca obtendremos (esto es lo que marca la m a) 9, 128709292e 2 o algo similar. Es la notaci on cient ca para el n umero 9, 12870929 102 . El n umero en punto otante de (1) no est a normalizado. Para considerarlo normalizado debemos escribirlo de la siguiente forma: 0, 912870929 101 o 0, 912870929e 1. (1)

Es decir, un n umero en punto otante es normalizado si la parte fraccionaria es de la forma 0.x1 x2 . . . con x1 = 0. Para los n umeros representados en base 10, 1 x1 9, pero para los n umeros en base 2 x1 = 1 siempre, de modo que la parte fraccionaria tendr a la forma 0,1x2 x3 . . . con xi = 0 o 1. N otese que un n umero de esta forma puede escribirse como (1 + f )21 siendo f = 0.x2 x3 . . .. Por lo tanto, en un ordenador que representa los n umeros en base binaria (que es el que consideraremos nosotros), los n umeros en punto otante normalizados tienen la siguiente forma: x = (1 + f ) 2e con 0f <1 y e un n umero entero. Al n umero f se le llama fracci on o mantisa y a e exponente o caracter stica. Los n umeros en punto otante de precisi on simple se almacenan en palabras de 32 bits, mientras que los de doble precisi on lo hacen en palabras de 64 bits. De estos, 52 bits se usan 23

para almacenar f , 11 bits para e y 1 bit para el signo del n umero, 0 para + y 1 para (Figura 7). Puesto que la fracci on debe estar entre 0 y 1 y se debe almacenar en 52 bits, debe resultar

s 0 1

exponente 11

fraccin 63

Figura 7: Palabra en punto otante en doble precisi on. que 252 f es un n umero entero que debe estar en el intervalo 0 252 f < 252 Y como 252 4,5 1015 , los n umeros en punto otante en doble precisi on se expresan, en base decimal, con 15 decimales. Debe notarse, nalmente que la parte fraccional completa de los n umeros en punto otante no es f sino 1 + f , que necesita 53 bits. Sin embargo, como la primera cifra decimal siempre es 1 (si el n umero est a normalizado), no es necesario almacenarlo. De hecho, el formato IEEE empaqueta 65 bits de informaci on en una palabra de 64 bits. Por otra parte, para el exponente se reservan 11 bits, as que e es un numero entero en el intervalo 0 e 211 = 2048. Sin embargo, debemos permitir exponentes negativos almacen andolos en los 11 bits disponibles. Para conseguirlo lo que se hace es acomodar en los 11 bits el n umero e+1023. As , si el n umero almacenado en los 11 bits de e es 1250 entonces e = 1250 1023 = 227; mientras que si el n umero almacenado es 1000 entonces e = 1000 1023 = 23. Los valores extremos posibles en estos 11 bits: 0 y 211 1 se reservan para denir n umeros especiales que veremos m as adelante. Los restantes son valores admisibles para e. Por lo tanto el exponente debe encontrarse en el intervalo 1022 e 1023. Teniendo en cuenta que (1 + 0,99999999999999) 21023 1,79 10308 y (1 + 0) 21022 2,23 10308 ,

estos son el mayor y menor n umeros representables en doble precisi on. En MATLAB estos n umeros reciben un nombre especial realmax = (1 + 0,99999999999999) 21023 = 1,7977 10308 realmin = 1 + 0) 21022 = 2,2251 10308 . Si alg un c alculo intenta producir un valor mayor que realmax se dice que produce un rebosamiento por arriba (overow) dando como resultado un n umero especial llamado innity, Inf en MATLAB. Se representa tomando e = 1024 y f = 0 y cumple propiedades tales como 1/Inf=0 o Inf+Inf=Inf. Por ejemplo

24

>> realmax^2 ans = Inf >> Inf*Inf ans = Inf Para operaciones tales como 0/0 o Inf-Inf el resultado es un valor excepcional denotado por el s mbolo NaN por not a number. >> 0/0 Warning: Divide by zero. ans = NaN >> Inf-Inf ans = NaN Si alg un c alculo intenta producir un n umero inferior a realmin, se dice que produce un rebosamiento por abajo (underow). En realidad, algunos sistemas como MATLAB permiten n umeros m as peque nos llamados n umeros en punto otante denormales (o subnormales, aunque esta denominaci on en castellano tiene connotaciones negativas). El n umero m as peque no en MATLAB es 2 ^ (-1074) 0.494e-323. Veremos m as adelante de donde proviene este n umero. >> 2^(-1074) ans = 4.9407e-324 > 2^(-1075) ans = 0 El rebosamiento por arriba (que rara vez ocurre en la pr actica) puede, a veces, evitarse escalando adecuadamente los datos del problema para convertirlo en un rebosamiento por abajo que no tiene consecuencias importantes. Por ejemplo, supongamos que tenemos que calcular la cantidad c= a2 + b2

con a = 10200 y b = 1. Una respuesta aceptable ser a c = 10200 debido a que b es insignicante en comparaci on a a. Si hacemos este c alculo directamente en MATLAB: >> a=10^200;b=1; c=sqrt(a^2+b^2) c = Inf

25

La respuesta es debida a que se ha producido un rebosamiento por arriba. Te oricamente, el mismo resultado se obtendr a si hici eramos c=s a s
2

b s

con s = 0. En particular, escogiendo s = m ax{|a|, |b|} = 10200 obtenemos lo siguiente: > s=max(abs(a),abs(b));c=s*sqrt((a/s)^2+(b/s)^2) c = 1.0000e+200 que es la respuesta que hemos dado como aceptable. Este resultado es debido al rebosamiento por abajo ocurrido al calcular (b/s)2 : >> (b/s)^2 ans = 0 Los fen omenos de rebosamiento tienen su origen en las cotas superior e inferior de los exponentes admisibles. Hay otro fen omeno importante que es consecuencia de la nitud de las posibles mantisas o fracciones: el redondeo. Comencemos con la siguiente pregunta: Cu antos n umeros en coma otante hay entre 1 y 2? Son los de la forma +(1 + f ) 20 . Y como f est a representado por 52 bits (i.e., 52 posiciones cada una de ellas conteniendo un 0 o un 1), el n umero posible de fracciones es 252 = 4,503599627370496e + 15 (las formas posibles de colocar 0 y 1 en 52 posiciones distintas). As pues, los posibles valores de f son: 0, 252 , 2 252 , 3 252 , 4 252 , . . . , (252 1) 252 . En consecuencia, los n umeros en punto otante en el intervalo [1, 2] son 1, 1 + 252 , 1 + 2 252 , 1 + 3 252 , 1 + 4 252 , . . . , 1 + (252 1) 252 , 2. De la misma forma, los n umeros en punto otante en el intervalo [2, 4) son de la forma +(1 + f ) 21 , y son, concretamente: 2, 2 + 251 , 2 + 2 251 , 2 + 3 251 , 2 + 4 251 , . . . , 2 + (252 1) 251 , 4. En general, los n umeros en el intervalo [2j , 2j +1 ] son los de (2) multiplicados por 2j . (2)

26

eps = 1/8 ||||||| |||||||| | | | | | | | | | | | | | | | | 1/16 1/2 1 2 | | | | | | | | 4 | | | | | | | 81/2

Figura 8: Floatgui. Ejercicio 17 En el directorio matlab de tu cuenta personal encontrar as un archivo titulado floatgui. Ha sido escrito por Cleve Moler para poner de maniesto la distribuci on de los n umeros positivos en punto otante en un sistema para el que es posible elegir los par ametros t (n umero de bits utilizado para almacenar f ) y em a e). ax y em n (el intervalo en el que est Inicialmente floatgui se presenta con t = 3, em on n = 4 y em ax = 3 y produce la distribuci de la Figura 8 Se puede observar que en cada intervalo binario [2j , 2j +1 ] los n umeros est an igualmente espaciados con un incremento de 2j t . Si j = 0 y t = 3, por ejemplo, el espacio entre los n umeros que est an entre 1 y 2 es 23 ; el espacio entre los que est an entre 2 y 3 es 22 , etc. Esta equidistribuci on se hace m as evidente si utilizamos una escala logar tmica. La Figura 9 muestra el resultado de floatgui cuando se marca la casilla de log scale con t = 5, em n = 4 y em = 3. ax
eps = 1/32 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| || 1/16 1/4 1/2 1 2 4 161/4

Figura 9: Floatgui. Experimenta con floatgui para comprender la distribuci on de los n umeros en punto otante y responde a las siguientes preguntas: Para un valores concretos de t, em antos n umeros n y em ax cu positivos son representables exactamente en punto otante? Cu antos n umeros positivos contiene el conjunto de n umeros en punto otante del sistema IEEE? Cualquier n umero real que no coincida con uno de los n umeros en punto otante del sistema IEEE debe ser aproximado por uno de ellos; concretamente por el m as pr oximo. A este fen omeno se le llama redondeo. Si x es un n umero real, se denota por (x), el n umero en punto otante m as pr oximo a x. Resulta que si realmin x realmax entonces | (x) x| 253 . |x| En efecto, suponiendo que x [2j , 2j +1 ] y que (x) = (1 + a 252 )2j entonces (1 + a 252 )2j x < (1 + (a + 1) 252 )2j o (1 + (a 1) 252 )2j < x (1 + a 252 )2j 27

Pero como (x) = (1 + a 252 )2j se tiene x (1 + a 252 )2j < (1 + (a + 1) 252 )2j x = (1 + a 252 )2j x + 2j 52 o (1 + a 252 )2j x < x (1 + (a 1) 252 )2j = x (1 + a 252 )2j x + 2j 52 . En cualquier caso 2|x (1 + a 252 )2j | < 2j 52 |x (1 + a 252 )2j | < 2j 53 Como (x) = (1 + a 252 )2j y x > 2j conclu mos que | (x) x| 253 . |x| Un razonamiento similar nos permite ver que, en t erminos relativos, la distancia entre dos 52 n umeros en punto otante consecutivos es 2 . En particular, esta es la distancia de 1 al siguiente n umero en punto otante tal y como hemos visto en (2). A este n umero, se le conoce con el nombre de epsilon de la m aquina y se denota en MATLAB por eps. As eps = 252 2,22 1016 y se obtiene en MATLAB con el comando eps: >> eps ans = 2.220446049250313e-16. Algunos autores preeren llamar epsilon de la m aquina al m aximo error relativo posible al redondear un n umero real por el n umero en punto otante m as pr oximo; i. e. eps/2=253 . En cualquier caso, el nivel de error relativo es de aproximadamente 16 d gitos decimales. N otese que 252 21022 = 21074 . Este n umero ya lo hemos visto antes: era el menor valor denormal (o subnormal) admisible en MATLAB. En el c alculo binario del n umero t=0.1 se produce un redondeo que suele afectar a muchas operaciones aritm eticas. El valor almacenado en t no es exactamente 0,1 porque la fracci on decimal 1/10 expresada en base 2 requiere una serie innita. Esto se entiende mejor si expresamos 1/10 en base 16; es decir, si usamos la representaci on hexadecimal : 1 9 9 9 = 24 1 + + 2 + 3 + 10 16 16 16 En efecto
j =1

(3)

1 1/6 1 = , = j 6 1 1/6 15 9 15 24 1 = . 16 15 10

y 24 1 + = 28

Para pasar (3) a formato binario observamos que 24 24 etc. 1 0 0 1 1 0 0 1 1 1 = 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + . 10 2 2 2 2 2 2 2 2 2 La representaci on en n umero de punto otante de 1/10 se obtiene tomando 52 t erminos de esta serie (en formato binario), o 13 t erminos de la serie en formato hexadecimal, y redondeando el u ltimo t ermino al entero m as pr oximo. En formato hexadecimal tendr amos que si t1 = 24 1 + t2 = 24 1 + entonces t1 < 1/10 < t2 . Pero resulta que 1/10 est a m as pr oximo a t2 que a t1 . Es decir, 1/10 = (1 + f ) 2e donde f= 9 9 9 10 + 2 + 3 + + 13 16 16 16 16 9 9 9 9 + 2 + 3 + + 13 16 16 16 16 9 9 9 10 + 2 + 3 + + 13 16 16 16 16 Por lo tanto 23 + 1 1 1 9 = = 5 + 8, 8 16 2 2 2 9 23 + 1 1 1 = = 9+ 1 , 162 212 2 2 2 (4)

(5)

e = 4 Hemos escrito f en formato hexadecimal. Para pasarlo a binario y conseguir los 52 bits que lo representan se proceder a como en (4). En realidad, la conversi on de n umeros entre las bases 2 y 16 es muy sencilla. Por ejemplo, en consonancia con (5), el comando de MATLAB format hex aplicado a t=0.1 produce: >> t=0.1 t = 0.1000 >> format hex >> t t = 3fb999999999999a

29

Las letras a a f representan los n umeros 10 a 15 en base hexadecimal. Para pasar t a binario basta observar que cada cifra es una palabra de cuatro bits. As 3fb en binario ser a 0011 1111 1011, que son los 12 primeros bits de t. El primer bit, 0, es el signo; por lo tanto t es positivo. Los primeros 12 bits para 0,1 ser a 1011 1111 1011, que en hexadecimal es bfb. Los restantes 11 bits representan el exponente (en realidad, recordemos, 1023+e). Como 3fb en base diez es 3 162 + 15 16 + 11 = 1019, resulta que e = 4. Las restantes cifras 999999999999a representan la fracci on que en binario ser a 1001 1001 1001 1001 1010 ocupando los 52 bits correspondientes. Para saber la representaci on hexadecimal de un n umero en MATLAB se puede usar el comando format hex. Una vez que se usa todas los resultados se presentar an en formato hexadecimal. Para volver al formato decimal se deben usar los comandos format short, o format long, o cualquiera de los otros disponibles. As , el siguiente c odigo nos da la raz on aurea en base 16: >> format hex >> phi=(1+sqrt(5))/2 phi = 3ff9e3779b97f4a8 Una vez m as, 3 es 0011 en binario, de modo que es positivo. Adem as 3ff en base 10 es 1023, por lo que e = 0. Las restantes 13 cifras hexadecimales contienen la fracci on f : f= Con estos valores de e y f (1 + f ) 2e . Ejercicio 18 1. Cu al es la representaci on hexadecimal de los n umeros 3/10 y 3 0,1? Por qu e no es la misma?. (Si eres capaz de deducir por qu e MATLAB produce esos resultados, mejor que mejor). Cu al es el error absoluto, tanto en formato hexadecimal como decimal, cometido al aproximar 3/10 por 3 0,1?. 2. Explica el resultado producido por el siguiente c odigo de MATLAB t = 0.1 n = 1:10 e = n/10 - n*t 9 14 10 8 + 2 + + 12 + 13 . 16 16 16 16

30

Dos u ltimos ejemplos en los que los efectos del redondeo se ponen de maniesto. El primero consiste en la resoluci on del siguiente sencillo sistema 17x1 + 5x2 = 22 1,7x1 + 0,5x2 = 2,2 (6)

Dado que la primera ecuaci on es 10 veces la segunda, este sistema tiene innitas soluciones y la m as simple es x1 = x2 = 1. Ejercicio 19 1. Resuelve el sistema (6) con MATLAB y comprueba que la soluci on obtenida no es x1 = x2 = 1.. (Indicaci on: MATLAB utiliza el comando A\b para resolver el sistema Ax = b mediante eliminaci on gaussiana.) 2. Utiliza MATLAB para hacer la eliminaci on gaussiana en etapas con formato cient co; i.e. format short e: >> A(2,:)=A(2,:)-1.7/17*A(1,:) >> b(2)=b(2)-1.7/17*b(1) Observa que los elementos a22 y b2 no son cero. Por qu e? 3. Como a22 y b2 no son cero, x2 = b2 /a22 . Calcula con MATLAB este valor y despu es calcula tambi en x1 . El u ltimo ejemplo de los efectos del redondeo lo vemos en el siguiente ejercicio Ejercicio 20 El comando conv(p,q) multiplica los polinomios p y q . Por ejemplo, si p(x) = 2x3 x + 3 y q (x) = 2x2 x + 2 entonces >>p=[2 0 -1 3]; q=[-2 -1 2]; >>conv(p,q) ans = -4 -2 6 -5 -5

de modo que el polinomio p(x)q (x) = 4x5 2x4 + 6x3 + . Considera el siguiente polinomio p(x) = (x 2)9 y utiliza el comando conv para calcular los coecientes de este polinomio, Ll amalo q . 1. Dibuja la gr aca de q (x) para x = 1,920, 1,921, 1,922, . . . , 2,080. 2. En la misma gura, dibuja en rojo p(x) en los mismos puntos. Qu e conclusi on sacas?.

Referencias
[1] C. B. Moler: Numerical computing with MATLAB. SIAM, 2004. [2] Ch. F. van Loan: Introduction to scientic computing. Prentice Hall.

31

You might also like