Metodos Numéricos
Metodos Numéricos
Metodos Numéricos
1. Objetivos
Entender sobre las fuentes de error en algortmos numricos.
Paso 0
Este es un ejemplo de como aparecern los pasos a acciones a
realizar. Fijes que est enumerado.
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?
3. Fundamentos tericos
La funcin exponencial se calcula evaluando la serie siguiente:
x
X xn
e =1+ (1)
n=1
n!
Paso 1
Escriba la siguiente rutina para calcular la funcin exponencial.
Guardela en un archivo llamado miexp.sci.
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;
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
12 // Vector de valores .
13 v = 0:0.1:5;
14
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
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