Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PRÁCTICA Nº 2: BUCLES Y
ERRORES DE REDONDEO
CURSO 2006-07
PRÁCTICA ELABORADA POR:
Prof. Carlos Conde Lázaro
Prof. Arturo Hidalgo López
Prof. Alfredo López Benito
Mayo 2007
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
OBJETIVOS DE LA PRÁCTICA
1º. Realizar algoritmos simples que utilicen estructuras repetitivas.
2º. Codificar números reales en aritmética binaria en coma flotante.
3º. Analizar la influencia de los errores de redondeo en los resultados de procesos de
cálculo.
BIBLIOGRAFÍA
Esta práctica sigue lo recogido en los apuntes:
C. Conde , A. Hidalgo y A. López (2001). Errores de redondeo en la
representación de números reales. Open Course Ware de la Universidad
Politécnica de Madrid
Algunos de los enunciados de los ejercicios de esta práctica están basados en los
recogidos en los libros:
L.F. Shampine, R.C. Allen, Jr. y S. Pruess (1997). Fundamentals of
Numerical Computing. Ed. John Wiley &Sons, Inc.
J. M. Viaño (1.995) Lecciones de Métodos Numéricos: 1.- Introducción
general y análisis de errores. Ed. Tórculo Edicións
1
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
An := ⌠
⎮
⎮ ex n (x − 1)
dx
⌡0
> n:=15;
n := 15
> AP:=vector(n,[]);
A:=vector(n,[]);
eabs:=vector(n,[]);
errel:=vector(n,[]);
AP := array ( 1 .. 15, [ ] )
A := array ( 1 .. 15, [ ] )
eabs := array ( 1 .. 15, [ ] )
errel := array ( 1 .. 15, [ ] )
En el valor de partida ya se comete un error al considerar sólo 7 dígitos significativos
del valor (1/e):
> A[1]:=1/exp(1);AP[1]:=evalf(1/exp(1),7);
2
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
1
A1 :=
e
AP1 := 0.3678794
> eabs[1]:=evalf(A[1]-AP[1],15);
eabs1 := 0.41171442 10 -7
> errel[1]:=evalf(abs(eabs[1]/A[1]),15);
errel 1 := 0.111915582640056 10 -6
> eabs[2]:=evalf(A[2]-AP[2],15);
eabs2 := -0.82342884 10 -7
> errel[2]:=evalf(abs(eabs[2]/A[2]),15);
errel 2 := 0.311620253237233 10 -6
Para la tercera:
> A[3]:=1-3*A[2];AP[3]:=evalf(1-3*AP[2],7);
6
A3 := −2 +
e
AP3 := 0.2072764
> eabs[3]:=evalf(A[3]-AP[3],15);
eabs3 := 0.24702865 10 -6
> errel[3]:=evalf(abs(eabs[3]/A[3]),15);
errel 3 := 0.119178235243190 10 -5
Hay una forma cómoda de obtener todos los valores que se nos piden. Esta forma
consiste en definir una estructura repetitiva (o bucle). En estos bucles se considera
una variable de control (vc) a la que inicialmente se le asigna un valor inicial (vinic), y
para la que se definen un valor final (vfin) y un incremento (incr). Las operaciones que
se incluyen en el bucle son realizadas en primer lugar para la variable de control
tomando el valor vinic. Una vez realizadas vuelven a repetirse para la variable de
3
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
control tomando el valor (vinic + incr). Tras ello se vuelven a repetir tomando la
variable de control el valor (vinic + 2 · incr). Y así sucesivamente hasta que la variable
de control tome un valor que sobrepase a vfin, en cuyo momento dejan de realizarse
las operacones incluidas dentro del bucle. Dos cosas importantes sobre los bucles son
que:
a) El valor final (vfin) debe poder alcanzarse incrementando las veces que sea
necesario "vinic" con el valor del incremento "incr". En caso contrario MAPLE te
indicará que hay un error.
b) La variable de control del bucle puede utilizarse en las operaciones del bucle.
Para "vc" desde "vinic" hasta "vfin" con incremento "incr" hacer:
Operaciones a realizar
Fin del bucle.
Observa que al haber finalizado el bucle con dos puntos (:) no se han escrito los
valores calculados. Si queremos verlos podemos decirle a MAPLE que nos los escriba
con ayuda de otro bucle y de la instrucción print( ). Esto es lo que haremos a
continuación. Además, para que sea más facil la comparación escribiremos sólo los 7
primeros dígitos significativos del valor exacto de las integrales calculadas.
4
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Podemos representar cómo evolucionan los valores calculados. Para que pueda
apreciarse en una misma gráfica lo que sucede con los valores exactos y aproximados
sólo representaremos los 11 primeros valores (pues para los sucesivos las escalas
entre los valores exactos y los aproximados son muy distintas).
5
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> with(plots):
> pointplot(pexac,color=blue,symbol=CROSS);
> pointplot(papr,color=red,symbol=DIAMOND);
6
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Para dibujar ambas secuencias de puntos en una misma gráfica puede utilizarse la
sentencia display( ) ya vista en prácticas anteriores.
>
dibexac:=pointplot(pexac,color=blue,symbol=CROSS):dibapr:=p
ointplot(papr,color=red,symbol=DIAMOND):
> display(dibexac,dibapr);
7
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Observa que los valores exactos (en azul) son siempre positivos y decrecientes en
tanto que los valores aproximados, en rojo, no son siempre positivos (caso n = 11 y
otros posteriores no representados) y su valor absoluto tampoco decrece (es más,
crece a partir de n = 10). Este hecho se refleja en las gráficas siguientes en las que se
representan los errores absolutos y realtivos cometidos)
8
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
9
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Otra forma de poner los errores de manifiesto es utilizar escalas logarítmicas como se
hace a continuación:
10
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> fin;
fin
Acumulación de errores.
> restart;
La idea del enunciado de este ejercicio se ha recogido de [3].
11
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
b) Sabiendo que x[n] = (1/3)^n (se deja como ejercicio propuesto demostrarlo)
compárense los valores obtenidos en el apartado a) con los exactos.
> Digits:=7;
Digits := 7
> x[0]:=1.;
xa[0]:=1.;
x[1]:=1./3.;
xa[1]:=1./3.;
x0 := 1.
xa0 := 1.
x1 := 0.3333333
xa1 := 0.3333333
Podemos ya calcular los valores siguientes. Así para x[2] y xa[2] procederíamos como
sigue:
> x[2]:=evalf((1/3)^2);
xa[2]:=(13./3.)*xa[1]-(4./3)*xa[0];
x2 := 0.1111111
xa2 := 0.111111
xa3 := 0.0370367
xa4 := 0.0123444
12
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> n:=20;
n := 20
> for i from 2 to n by 1 do
x[i]:=evalf((1/3)**i):
xa[i]:=(13./3.)*xa[i-1]-(4./3.)*x[i-2]:
od:
Si deseas ver todos los valores calculados, así como la dferencia entre ellos, puedes
utilizar otro bucle como el que sigue:
13
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Volviendo a nuestro objetivo inicial, puedes observar en los valores que se acaban de
escribir cómo van obteniendose dos sucesiones totalmente distintas en x[i] y en xa[i]
debido a la acumulación de los errores de redondeo.
Dibujémoslas. Como los últimos valores son muy dispares, y en una gráfica que
incluyese todos no se apreciaría la primera solución, dibujemos sólo los 13 primeros
valores:
> dibex:={seq([k,x[k]],k=0..13)}:
dibap:={seq([k,xa[k]],k=0..13)}:
dibdif:={seq([k,difer[k]],k=0..13)}:
diferr:={seq([k,log(errel[k])],k=0..13)}:
> with(plots):
14
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
15
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Observa como el crecimiento de los errores acumulados nos conduce, para índices
"altos", a resultados que nada tienen que ver con los reales.
> fin_de_la_primera_parte_del_ejemplo;
fin_de_la_primera_parte_del_ejemplo
16
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> restart;
> Digits:=7;
Digits := 7
> x[0]:=1.; x[1]:=4.;
xa[0]:=1.; xa[1]:=4.;
x0 := 1.
x1 := 4.
xa0 := 1.
xa1 := 4.
> n:=20;
n := 20
> for i from 2 to n by 1 do
x[i]:=evalf((4.)**i):
xa[i]:=(13./3.)*xa[i-1]-(4./3.)*x[i-2]:
od:
> for i from 0 to n by 1 do
difer[i]:=x[i]-xa[i]:
errel[i]:=abs(difer[i]/x[i]):
print(i,x[i],xa[i],difer[i],errel[i]);
od:
0, 1., 1., 0., 0.
1, 4., 4., 0., 0.
2, 16., 16.00000 , 0., 0.
3, 64., 64.00000 , 0., 0.
4, 256., 256.0000 , 0., 0.
5, 1024., 1024.000 , 0., 0.
6, 4096., 4096.000 , 0., 0.
7, 16384. , 16384.00 , 0., 0.
8, 65536. , 65536.00 , 0., 0.
9, 262144. , 262144.0 , 0., 0.
10, 0.1048576 10 7, 0.1048576 10 7, 0., 0.
11, 0.4194304 10 7, 0.4194304 10 7, 0., 0.
12, 0.1677722 10 8, 0.1677722 10 8, 0., 0.
13, 0.6710886 10 8, 0.6710888 10 8, -20., 0.2980232 10 -6
14, 0.2684355 10 9, 0.2684355 10 9, 0., 0.
15, 0.1073742 10 10, 0.1073742 10 10, 0., 0.
17
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
18
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Puedes observar que, ahora los errores relativos en las soluciones obtenidas son
"insignificantes". No sucede lo mismo con los errores absolutos (que llegan a ser de
hasta 10000000) pero al referirse a números muy elevados (del orden del billón) su
gravedad se relativizaconsiderablemente. Y ello es debido a que ahora se trabaja con
números de magnitud elevada.
19
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> fin;
fin
Sumatorios
Calculemos la suma de los números naturales impares mayores o iguales a 1 e
inferiores a 500
> n:=500:
> suma:=0:
for i from 1 to n by 2 do
suma:=suma + i:
od:
> suma;
62500
Calculemos ahora por una parte la suma de los números enteros múltiplos de 6
superiores a 1 e inferiores 327.
> k:=327:
> suma6:=0:
for i from 6 to k by 6 do
suma6:=suma6 + i:
od:
> suma6;
8910
NOTA1: MAPLE tiene una instrucción llamada sum para calcular sumatorios sin
necesidad de programar los bucles. En la ayuda de MAPLE puedes consultar su
funcionamiento y reglas. Nosotros sólo lo ilustramos con un ejemplo en el que
calculamos las suma de los 100 primeros números naturales.
20
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
Productorios
> restart;
> producto:=1:
for i from 2 to 24 by 2 do
producto:=producto*i:
od:
> producto;
1961990553600
Calculemos ahora por una parte la suma de los números enteros múltiplos de 6
superiores a 1 e inferiores 49.
> m:=49:
producto6:=1:
for i from 6 to m by 6 do
producto6:=producto6*i:
od:
> producto6;
67722117120
21
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> restart;
> n:=5:
> A:=matrix(n,n,[[1,-2,3,-4,5],[3,6,9,12,15],[-2,-4,6,
8,10],[1,1,1,1,1],[5,0,0,5,0]]);
⎡ 1 -2 3 -4 5⎤
⎢ ⎥
⎢ 3 6 9 12 15⎥
⎢ ⎥
⎢ ⎥
A := ⎢⎢-2 -4 6 8 10⎥⎥
⎢1 1 1 1⎥⎥
⎢ 1
⎢ ⎥
⎢5 0 0 0⎥⎦
⎣ 5
> suma:=0:
for i from 1 to n by 2 do
for j from 2 to n by 2 do
suma:=suma + A[i,j]:
od:
od:
> suma;
3
Como ves en los bucles anidados anteriores las variables de control han jugado
el papel de subíndices de los elementos de la matriz.
> fin;
fin
EJERCICIOS
Acumulación de errores de redondeo..
La SUCESIÓN GENERAL DE NÚMEROS DE FIBONACCI puede generarse mediante
la fórmula de recurrencia siguiente:
F[0]=1, F[1] = c, F[n]=F[n-1]+F[n-2] (n = 2, 3, .....)
22
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
An := ⌠
⎮
⎮ ex n (x − 1)
dx
⌡0
: Ai := 1 − i Ai − 1( i = 2 .. ∞ )
partiendo del valor (obtenido para n = 1):
1
A1 := = 0.36787944117144232160
e
Según se vio en dicho ejercicio, el error se iba acumulando de forma tal que los
valores que se obtenían para n suficientemente altos no tenían nada que ver con los
exactos.
Otra forma de calcular estas integrales consiste en proceder en retroceso estimando el
valor de la integral para un valor de n en función del valor obtenido para (n+1).
Concretamente:
1 − Ai + 1
Ai :=
i+1
23
Programación y Métodos Numéricos. C. Conde, A. Hidalgo y A. López
Práctica 2 :Bucles y errores de redondeo ETSI Minas de la Univ. Politécnica de Madrid
> restart;
>
>
>
>
>
>
>
24