Práctica 3: Errores de redondeo y errores de cancelación 1. Errores de redondeo Recuerde que según el estándar IEEE que sigue Matlab, los números de máquina de doble precisión se almacenan en un registro de 64 bits, de los cuales 1 bit se dedica al signo, 11 a la exponente y 52 bits a la mantisa. En particular, esto hace que los números de máquina F conformen un conjunto finito, y por tanto, los números reales tienen que aproximarse con números de máquina. Esto es redondeo. Recuerde que si a x ∈ R le corresponde x b ∈ F, se tiene que cumplir que x b = x(1 + δ) , |δ| ≤ eps donde eps es el épsilon de la máquina. El ejemplo más sencillo de redondeo se produce al asignar x = 0,1. En efecto, el valor decimal 0,1 ∈ / F. En efecto, 9 9 1 −4 = (0,0001100110011001 . . . )2 = 2 1+ + + ... . 10 16 16 Vamos a encontrar el número de máquina que corresponde al valor decimal 0,1. Para ello utilizaremos la posibilidad que nos da Matlab de ver el número tal y como es almacenado en el registro por medio del comando format hex, que impone el estándar hexadecimal. De manera que: Ejercicio 1 Asigne el valor decimal 0,1 a la variable x, cambie al formato hexadecimal y examine el valor de x. Interprete el resultado y obtenga el valor decimal correspondiente al número de máquina al que es redondeado 0,1. Ejercicio 2 Ejecute el siguiente código de Matlab: format long a = 4/3 b = a - 1 c = 3*b e = 1 - c Práctica de ordenador III 2 De efectuarse los cálculos en aritmética exacta, ¿cuál deberı́a ser el valor de e? ¿Puede identificar el valor que ha obtenido y explicarlo? 2. Errores de cancelación Recuerde que los errores de cancelación consisten en la pérdida drástica de cifras significativas exactas al restarse dos valores numéricos cercanos. El peligro está en que, a diferencia de las excepciones de exponente, el hecho de producirse estos errores no se revela de inmediato: es una “muerte silenciosa”. Vamos a estudiar experimentalmente los errores de cancelación que se producen al intentar aproximar el valor de una derivada por la fórmula f ′ (x) ≈ f (x + h) − f (x) , h h > 0. Sabemos que si f es derivable en x, f (x + h) − f (x) = f ′ (x) , h→0 h lı́m de modo que a menor h deberı́amos tener mejor aproximación. Sin embargo, para pequeños valores de h tenemos f (x + h) ≈ f (x), y nos arriesgamos a perder precisión por cancelación. ¿Cuál es el valor “óptimo” del paso h? Ejercicio 3 Tomemos f (x) = sen(x) y x = 1, de modo que f ′ (x) = cos 1 = 0,54030230586814 . . . y vamos a asignar valores a h = 10−1 , 10−2 , . . . , 10−20 . Realice a continuación con la ayuda de MATLAB las siguientes tareas consecutivamente: 1. Vamos a crear el fichero aproxder.m que contendrá el script del experimento. Usaremos las siguientes variables con sus inicializaciones: n=1; (contador), x=1; (el punto), h=1; (el paso), deriv=cos(x); (valor exacto de la derivada). 2. Complete el siguiente ciclo que en cada paso calcule la aproximación dif a f ′ (x) y el error absoluto cometido: while n <= 20, h = h/10; dif = ...; error = ...; fprintf(’ %5.1e n = n+1; end Andrei Martı́nez Finkelshtein %13.6e %13.6e \n’, h, dif, error); Práctica de ordenador III 3 3. Ejecute el script obtenido y encuentre los valores de h para los que se produce el error más pequeño. 4. Para poder visualizar el resultado, vamos a modificar ligeramente el script anterior para poder dibujar la gráfica de los errores absolutos con respecto a h. Para ello necesitamos poder almacenar los valores de h y de error obtenidos en cada iteración. Una de las maneras más sencillas es introducir dos variables más, hac y errorac, inicializándolas como vectores vacı́os: hac = [ ]; errorac = [ ]; e incluyendo dentro del ciclo los comandos while n <= 20, ... errorac=[errorac,error]; hac=[hac,h]; end ¿Cómo funcionan estos comandos? 5. Ejecute nuevamente el script; ahora los valores de h y error se almacenan en los vectores hac y errorac, respectivamente. 6. Dibuje la gráfica de la relación entre h y el error absoluto por medio de la instrucción plot(hac,errorac,’x’); El modificador ’x’ hace que los puntos sean indicados por pequeñas cruces y no se unan por una poligonal. ¿Es informativo el gráfico? ¿Dónde está el problema? 7. Inténtelo ahora con la escala logarı́tmica por medio de loglog(hac,errorac,’x’); ¿Cuál es la conclusión final del experimento? Ejercicio 4 Lleve a cabo un experimento similar, modificando el script del ejercicio anterior donde haga falta, para estudiar la cancelación para la aproximación por medio de las diferencias centrales f ′ (x) ≈ Andrei Martı́nez Finkelshtein f (x + h) − f (x − h) , 2h h > 0. Práctica de ordenador III 4 Ejercicio 5 Dado el polinomio p(x) = ax2 + bx + c, con a = c = 1 y b = −100000000, encuentre sus dos raı́ces por medio de la fórmula √ −b ± b2 − 4ac x1,2 = , 2a y compare con las raı́ces que Matlab obtiene por medio del comando roots([a b c]). ¿En qué raı́z observa diferencia y por qué? ¿Cómo se puede modificar el procedimiento de cálculo para evitar ese error? Andrei Martı́nez Finkelshtein