Práctica 3: Errores de redondeo y errores de cancelación

Anuncio
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
Descargar