You are on page 1of 9

Laboratorio Mtodos Numricos

Errores por truncamiento y redondeo


Dr. Victor Snchez Urrutia

1. Objetivos
Entender sobre las fuentes de error en algortmos numricos.

Aprender a usar Scilab para programar, graficar y realizar explora-


ciones numricas.

2. Uso de sta gua


Esta gua de laboratorio contiene:

1. Parte de la teora requerida para poder realizar y entender el ex-


perimento numrico propuesto, recomendamos que lea bien sta
gua antes del principio de la sesin de laboratorio.

2. Una serie de pasos o acciones que deben ejecutar en el laboratorio.


Para que sea ms fcil de localizar estos pasos dentro del docu-
mento, stos sern resaltados de la siguiente manera:

Paso 0
Este es un ejemplo de como aparecern los pasos a acciones a
realizar. Fijes que est enumerado.

3. Adems de las acciones a tomar se les harn preguntas o se les


pedir que realice trabajo extra. Estas preguntas o trabajos extras
son los que deben entregarse como su informe de laboratorio. Para
que sea fcil localizarlas y no se le olvide, las resaltaremos de la
siguiente manera:

0
Ejemplo: Modificar el programa xxx para que calcule otra co-
sa. Entregue el programa en su informe. Piensa usted que la
nueva versin es ms rpida?

4. En algunas situaciones haremos comentarios importantes que in-


dicaremos de la siguiente manera:

Divisin entre cero


Al calcular el error aproximado, se puede dar el caso que el
nuevo o mejor valor sea cero y por consiguiente el error
aproximado sea infinito...

Los informes de laboratorio deben ser entregados antes del labora-


torio siguiente. El informe debe estar contenido en una archivo Word u
OpenOffice con todas sus grficas y tablas incluida en el mismo docu-
mento. Debe tratar de que su escritura sea coherente y todas las pregun-
tas que se le hicieron en la gua estn contempladas. Si se le pide que
haga o modifique programas estos deben ser entregados en archivos
aparte, tambin cualquier archivo de datos utilizados.
Estos archivos sern entregados segn instruccin del profesor o pro-
fesor de laboratorio utilizando la plataforma Moodle.

3. Fundamentos tericos
La funcin exponencial se calcula evaluando la serie siguiente:

x
X xn
e =1+ (1)
n=1
n!

donde n! corresponde al factorial de n:


n
Y
n! = n n 1 . . . 1 = m (2)
m=1
= n (n 1)!; 1! 1 Forma recursiva (3)
y, como sabemos, para un exponente entero:
n
Y
n
x = x (4)
m=1

= x x n1 ; x1 x Forma recursiva (5)

Para implementar la serie (1) es mucho ms eficiente usar las formu-


laciones recursivas.
Sin embargo, obviamente no se puede realizar la sumatoria en (1)
hasta el infinito! Lo que hay que hacer evaluar la serie hasta que el re-
sultado sea lo suficientemente bueno. O sea, que la evaluacin de la serie
debe detenerse luego que el error del clculo menor que un techo desea-
do. Este error, el que ocurre al cortar el clculo de una serie, se le conoce
como error de truncamiento.
El error real de clculo aproximado se define como,
valor aproximado valor real

er = (6)
valor real

Al realizar mtodos numricos generalmente no conocemos el valor


real de un clculo (si lo tenemos para que estamos calculandolo si ya lo
tenemos?), en vez de eso se usa un error aproximado.
En un algoritmo tipo iterativo, esto se hace asumiendo que cada ite-
racin mejora el estimado de la respuesta, de manera que la ltima ite-
racin se toma como el valor real o verdadero:
valor penltima iteracin valor ltima iteracin

ea =
(7)
valor ltima iteracin

Si aplicamos la ecuacin (7) en la iteracin i a nuestro problema te-


nemos que:
Pi1 x n Pi xn

1 + n=1 (1 + )

n! n=1 n!
ea = Pi xn
(8)
1 + n=1 n!


i

xi!


= Pi n
(9)
1 + n=1 xn!

ltimo trmino de la serie calculado



= (10)
ltimo valor calculado
4. Implementacin

Paso 1
Escriba la siguiente rutina para calcular la funcin exponencial.
Guardela en un archivo llamado miexp.sci.

1 function [ res , n ] = miexp ( x , err_max )


2 // Funcin que calc ula l a exponencial
3 // x : exponente de e
4 // err_max : mximo error aproximado permitido
5 // res : resultado ( e^x )
6 // n : cantidad de i t e r a c i o n e s
7

8 // Arrancamos dando l a s condiciones i n i c i a l e s


9 n = 1; // Contador de i t e r a c i o n e s
10 res = 1 ; // Resultado f i n a l 1 + sum ( . . . )
11 xn = x ; // variable que guarda x^n
12 nfact = 1 ; // variable que guarda n !
13 err_aprox = 100; // En l a primera i t e r a c i o n no t i e n e s e n t i d o hablar
14 // de error , pero necesitamos empezar con algo para
15 // que e l c i c l o " while " pueda arrancar
16

17 // Iteramos hasta que e l prximo


18 // trmino sea menor o igual err_max
19

20 while err_aprox > err_max


21

22 termino = xn/ nfact ; // Trmino de l a s e r i e


23

24 res = res + termino ; // Nuevo valor mejorado


25

26 // Clculo del error , lea e l comentario sobre s t e c l c u l o en l a gua


27

28 err_aprox = abs ( termino/ res ) ;


29

30 // Cuando uno est probando un nuevo programa es importante


31 // examinar que est pasando para poder " depurar " e l programa
32 // y ver s i hay errores . Es comn poner i n s t r u c c i o n e s para imprimir
33 // resultados p a r c i a l e s . No tenga pereza de poner tantos comandos
34 // de impresin como sea necesario .
35 // Cuando usted e s t seguro que e l programa corre bien , entonces puede
36 // ponerle un // antes para c o n v e r t i r l a en un comentario
37

38 // f j e s e que l o s dos puntos a l f i n a l de l a l i n e a indica que e l


39 // comando sigue en otra l n e a . S i no l o s pone l e s va a dar un error .
40

41 pr intf ( " I t e r : %i , res : %e, Termino : %e, Error aprox : %e\n" , . .


42 n , res , termino , err_aprox )
43

44 n = n+1; // Aumentamos e l contador de i t e r a c i n .


45 xn = xn * x ; // Uso de l a formulacin recursiva para c a l c u l a r x^n
46 nfact = nfact * n ; // Uso de l a formulacin recursivas para c a l c u l a r n !
47 end ;
48

49 endfunction

Paso 2
En Scilab, cargue la funcin (use F5) y asegurese que no hay errores
de sintaxis. Ejecute la instruccin format(25) lo que har que Sci-
lab imprima los resultados con todas las cifras disponibles. Pruebe
la rutina con x = 5 y err_max = 1D-4 comparela con la funcin
exp(x) definida en Scilab.
Para probar nuestra rutina para calcular la exponencial, comparare-
mos el resultado con la funcin exp(x) provista por Scilab. Por supuesto
que Scilab tambin calcular esa funcin usando un mtodo numrico,
pero las bibliotecas numricas usadas por Scilab son muy buenas y estn
bien probadas.
En la vida real no siempre contaremos con ese lujo a la hora de pro-
bar nuestros programas y tendremos que probar el programa corriendo
casos conocidos o en donde tenemos una buena idea de cual es un re-
sultado probable. En la prctica, para problemas complejos tendremos
que realizar experimentos reales para comprobar nuestros resultados.
Paso 3
Ahora llame a la funcin con valores de error permitido cada vez
ms pequeos: 1D-6,1D-8,1D-10, etc. Compare con el resultado da-
do por Scilab. Fjese como nuestra respuesta se va acercado ms al
resultado dado por Scilab.
Al mismo tiempo, miren el trmino en cada iteracin. Se ve que
va reducindose en cada iteracin. Adems, a medida que pedimos ms
precisin (menor error) el nmero de iteraciones va aumentando. Lo que
vamos haciendo al aumentar las iteraciones es reducir el error por trun-
camiento. Al hacer ms iteraciones la calidad de la respuesta va aumen-
tando... o por lo menos as debe ser si no aparecen otros problemas
numricos en el camino.
Paso 4
Ahora, utilice un error de 1D-6 y vaya aumentando x a valores 10,
20, 50. Fjese como el nmero de iteraciones va aumentando, revise
los trminos tambin.
Todo parece ir bien. Ahora haremos una prueba con nmeros negati-
vos.
Paso 5
Pruebe su programa con el mismo error pero ahora con x = 5.
Repita ahora con x = 50. Compare con la funcin de Scilab... Qu
pas aqu?
Nuestras ecuaciones estn bien. No tenemos errores aparentes de
programacin ya que funcion para muchos valores y de forma correcta.
Lo que tenemos es otro problema importante al hacer clculos nu-
mricos y se debe a los errores que provienen del hecho la computadora
tiene una capacidad limitada de representar nmeros. Si estos nmeros
fueran guardados con precisin completa eventualmente los negativos
cancelaran los positivos y el resultado sera muy cercano a cero. Pero
al ir perdiendo precisin esa cancelacin no se da y acabamos con un
enorme error!
Hay estrategias para reducir estos problemas...obviamente el que pro-
gram la funcin exp() en Scialb supo resolver ese problema. Por suer-
te, la solucin no es tan complicada. Ya sabemos que nuestro algoritmo
se comporta bien cuando el argumento es positivo. Entonces podemos
echar mano a algo conocido por nosotros:

ex 1/ex (11)

1
Para tarea, modifique el programa dado de manera que si el argu-
mento es negativo entonces utilice ec. (11): haga el clculo con el
argumento positivo y al final saque la inversa. Llame as su progra-
ma nuevo miexpneg.sci.
Para este laboratorio seguiremos con el programa que tenemos pero
usaremos solo nmeros positivos.
Paso 6
Ahora defina un vector v con valores de 0 a 5 incrementando en .1:

v = 0:.1:5;

y calcule exp(v). Compare con miexp(v,0.0001). Qu pas? Tra-


te de arreglar miexp() para evitar el problema. Empiece por co-
mentar o eliminar la lnea que imprime resultados (la lnea 41 y 42).
No la necesitaremos ya que era principalmente para ver que estaba
haciendo el programa.
Es importante que sepa la diferencia que hace Scilab entre una ope-
racin matricial o vectorial y una operacin elemento por elemento. Esto
es especialmente importante cuando usamos la multiplicacin y expo-
nenciacin. Para hacer la multiplicacin matricial se usa el operador *
para hacer la operacin por elementos se usa .*.
Los errores son ahora vectoriales
Hay una complicacin. La evaluacin del error se har en varios
clculos a la vez. Habr que tomar el mayor error de todos para
decidir cuando parar los clculos.
Otro problema es que arrancamos la funcin asumiendo que x era un
nmero y no una matriz, de manera que la variable res era inicializada
a nmero 1 y ahora debe ser inicializada a un vector de 1s. Hay que
cambiar la lnea res lneas por res = ones(x). Mire en el manual de
Scilab que hace la funcin ones().
Siga tratando de buscar errores y arreglndolos.
5. Guiones y graficacin

Paso 7
Escriba el siguiente guin o script en un archivo llamado
compara.sci. Crralo y observe las grficas. Estudie como se obtu-
vieron las grficas.

1 // E s t e guion ( s c r i p t ) s i r v e para
2 // i n v e s t i g a r e l comportamiento de l a
3 // aproximacion del exponencial .
4 // Tambin i l u s t r a como graficar en S c i l a b .
5

6 // Los guiones no son funciones , s i no " programas " , no tienen argumentos


7 // de entrada ni s a l i d a s . Solo ejecutan una s e r i e de comandos .
8

9 // La funcin input pide un valor


10 err_max = input ( " Error mximo aproximado : " ) ;
11

12 // Vector de valores .
13 v = 0:0.1:5;
14

15 // E s t e c i c l o e j e c t u t a miexp para cada uno de l o s valores de v


16 // Y l o compara a l valor " verdadero " que s e r a e l que da S c i l a b .
17

18 for n = 1 :max( size ( v ) )


19 [ apr ( n ) , i t e r ( n ) ] = miexp ( v ( n ) , err_max ) ;
20 verdadero = exp ( v ( n ) ) ;
21 errabs ( n ) = abs ( ( apr ( n)verdadero ) / verdadero ) ;
22 end ;
23

24 // Grafica del error absoluto


25 scf ( 0 ) ;
26 clf ( ) ;
27

28 plot2d ( v , errabs ) ;
29 x t i t l e ( " Error r e l a t i v o de l a aprox . " , . .
30 " Valores del argumento " , " Error r e a l r e l a t i v o " )
31

32 // Grafica del numero de i t e r a c i o n e s


33

34 scf ( 1 ) ;
35 clf ( ) ;
36 plot2d ( v , i t e r ) ;
37 x t i t l e ( " Costo computacional " , . .
38 " Valores del argumento " , "Numero de i t e r a c i o n e s " )

2
En el paso anterior se modific la funcin miexp() para que funcio-
nara con argumentos vectoriales como la funcin exp() de Scilab.
Porqu no usamos esa modificacin para simplemente usar correr
el vector en una sola operacin?

3
Modifique la funcin que calcula el exponencial de manera que cada
termino sea guardado en un arreglo o vector. Luego realice la su-
ma de los diferentes trminos empezando del final hacia adelante y
compare con el resultado obtenido con la suma normal, de adelan-
te hacia atrs. Pruebe varios valores y use tolerancias bajas. Cal
mtodo es ms exacto? Porqu?
Sugerencia: guarde los termino asignandolos a una varible: ej.
s(i)=termino (i es un contador). En Scilab no necesita definir el ta-
mao del arreglo, la variable s crecer a medida que se asignan
nuevos valores

You might also like