Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Analisis Numerico de Ecuaciones Diferenciales Usando MATLAB PDF
Analisis Numerico de Ecuaciones Diferenciales Usando MATLAB PDF
Analisis Numerico
de
Ecuaciones Diferenciales
usando MATLAB
2
Indice general
Notaciones 5
Introduccion 6
1. Introduccion a MATLAB. 11
1.1. Vectores en MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2. Matrices en MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3. Funciones de vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.4. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4.1. Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.5. La instruccion if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.6. Ficheros ejecutables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.7. Subrutinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.8. Cadenas de texto, mensajes de error, entradas . . . . . . . . . . . . . . . . 33
1.9. Comparando la eficiencia de algoritmos: cputime . . . . . . . . . . . . . . . 34
1.10. Formatos de salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.11. Graficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
1.11.1. Representaciones en 2D . . . . . . . . . . . . . . . . . . . . . . . . 35
1.11.2. Representaciones en 3D . . . . . . . . . . . . . . . . . . . . . . . . 37
1.12. Resumen de funciones elementales y matrices especiales . . . . . . . . . . . 39
3
4
NOTACIONES
Notaciones generales
Smbolo Significado
x = (x1 , x2 , ..., xN ) Elemento de IRN
r = |x|= (x21 + x22 + ...+ x2N )1/2 Modulo de x
u u u
u = x ,
1 x2
, ..., x N
Gradiente de u
Espacios de funciones
Smbolo Significado
C() Funciones continuas en
C0 () Funciones continuas en con soporte compacto
C k () Funciones de clase k en
C0k () Funciones de C k () con soporte compacto
C () Funciones indefinidamente diferenciables en
C0 () = D() Funciones de C () con soporte compacto
6
Introduccion
7
8
Parte I
9
Captulo 1
Introduccion a MATLAB.
Vamos a optar por MATLAB para programar los algoritmos que aparecen asociados
a los distintos metodos numericos que estudiaremos a lo largo del curso. La razon de ello
es que, para propositos docentes, existen ventajas en la utilizacion de este software de
calculo matematico respecto a lenguajes de programacion como C o Fortran: por un lado,
la sintaxis de programacion de MATLAB es bastante similar a la de cualquier lenguaje
de alto nivel, lo que nos permitira adaptarnos a las peculiaridades de su programacion
sin demasiados problemas; por otro lado, podremos utilizar como test de nuestros propios
algoritmos las rutinas especficas que incorpora MATLAB; por ultimo, la integracion
de una serie de paquetes graficos en el entorno de programacion de MATLAB facilita
extraordinariamente la tarea de presentacion de resultados.
Los ejemplos que se incluyen en las secciones siguientes se han obtenido con la version
6.0 (R12) de MATLAB. Al tratarse de ejercicios sencillos, no es esperable diferencias
significativas cuando se reproduzcan en versiones posteriores de MATLAB.
La aritmetica de trabajo en MATLAB es doble precision (concepto que aclararemos
posteriormente) aunque la version 7.0 ha introducido la posibilidad de trabajar con arit-
metica entera y real de precision simple.
Una vez hemos accedido a MATLAB y estando situados en la ventana de coman-
dos, comenzamos nuestro recorrido introductorio. En el texto que sigue a continuacion,
cualquier lnea que comienza con dos signos >> se utiliza para denotar una lnea de
comando MATLAB.
11
12
>> 0:2:8
ans =
0 2 4 6 8
>> ans
ans =
0
2
4
6
8
Para guardar los vectores creados de modo que seamos capaces de trabajar con ellos
posteriormente, debemos darles nombre. Por ejemplo, para crear el vector fila v, tecleamos:
>> v = [0:2:8]
v =
0 2 4 6 8
13
>> v
v =
0 2 4 6 8
>> v;
>> v
ans =
0
2
4
6
8
Podemos darnos cuenta a partir del ejemplo anterior que si finalizamos una lnea con
un punto y coma no se muestra el resultado. MATLAB permite tambien trabajar con
elementos especficos del vector:
>> v(1:3)
ans =
0 2 4
>> v(1:2:4)
ans =
0 4
>> v(1:2:4)
ans =
14
0
4
Una vez especificada la notacion podemos realizar diversas operaciones. Por ejemplo:
>> v(1:3)-v(2:4)
ans =
-2 -2 -2
>> A = [ 1 2 3; 3 4 5; 6 7 8]
A =
1 2 3
3 4 5
6 7 8
>> B = [ [1 2 3] [2 4 7] [3 5 8]]
B =
1 2 3
15
2 4 5
3 7 8
>> whos
Name Size Elements Bytes Density Complex
A 3 by 3 9 72 Full No
B 3 by 3 9 72 Full No
ans 1 by 3 3 24 Full No
v 1 by 5 5 40 Full No
Volviendo a las matrices y a la hora de realizar operaciones basicas con las mismas, la
notacion que utiliza MATLAB es la usual en algebra lineal. Obviamente, las operaciones
matriciales deben ser legales si no queremos tener problemas:
>> v = [0:2:8]
v =
0 2 4 6 8
>> A*v(1:3)
??? Error using ==> * Inner matrix dimensions must agree.
>> A*v(1:3)
ans =
16
16
28
46
Podemos trabajar con diferentes partes de una matriz, al igual que vimos que se poda
hacer con vectores. De nuevo, debemos tener cuidado en hacer operaciones permitidas:
>> A(1:2,3:4)
??? Index exceeds matrix dimensions.
>> A(1:2,2:3)
ans =
2 3
4 5
>> A(1:2,2:3)
ans =
2 4
3 5
>> inv(A)
ans =
17
1.0e+15 *
Conviene hacer notar, en este punto, que MATLAB distingue entre mayusculas y
minusculas. Esta es otra potencial fuente de problemas cuando trabajamos con algoritmos
complicados:
>> inv(a)
??? Undefined function or variable a.
Otra posible operacion es, por ejemplo, la obtencion de los valores propios aproxima-
dos de una matriz. Hay dos versiones de esta rutina: una encuentra los valores propios y
la otra encuentra los valores y vectores propios. Si no recordamos cual es cual, podemos
obtener mas informacion tecleando eig en la lnea de comandos.
>> eig(A)
ans =
14.0664
-1.0664
0.0000
v =
e =
14.0664 0 0
0 -1.0664 0
0 0 0.0000
>> diag(e)
ans =
14.0664
-1.0664
0.0000
Existen tambien rutinas que permiten encontrar soluciones de ecuaciones. Por ejem-
plo, si Ax = b y queremos encontrar x, un modo lento de hacerlo es, simplemente,
invertir A y realizar una multiplicacion por la izquierda sobre ambos lados de la ecuacion.
Obviamente, hay metodos mas eficientes y mas estables para hacer esto (descomposiciones
L/U con pivotes, por ejemplo). MATLAB tiene comandos especiales para hacer esto.
MATLAB posee ademas dos tipos diferentes de operadores / y \. La accion del primer
operador es la siguiente: x = A\v A1 v; la accion del segundo operador es: x = v/B
vB 1 . Se dan ejemplos de su uso a continuacion:
>> v = [1 3 5]
v =
1
3
5
>> x = A\v
x =
1.0e+15 *
1.8014
-3.6029
1.8014
>> x = B\v
x =
2
1
-1
>> B*x
ans =
1
3
5
>> x1 = v/B
x1 =
>> x1*B
20
ans =
Finalmente, si queremos borrar todos los datos del sistema y comenzar de nuevo uti-
lizaremos el comando clear. Conviene utilizar este comando con cuidado porque MATLAB
no pide una segunda opinion ...
>> clear
>> whos
>> v = [1 2 3]
v =
1
2
3
>> b = [2 4 6]
b =
2
21
4
6
>> v+b
ans =
3
6
9
>> v-b
ans =
-1
-2
-3
>> v*b
Error using ==> * Inner matrix dimensions must agree.
>> v*b
ans =
2 4 6
4 8 12
6 12 18
>> v*b
ans =
22
28
Hay ocasiones en las que queremos realizar una operacion sobre cada elemento de un
vector o matriz. MATLAB permite hacer este tipo de operaciones. Por ejemplo, supon-
gamos que queremos multiplicar cada componente de un vector v por la correspondiente
componente del vector b. En otras palabras, Supongamos que queremos hallar v(1)*b(1),
v(2)*b(2) y v(3)*b(3). Estara bien utilizar el smbolo * puesto que estamos haciendo un
tipo de multiplicacion. Sin embargo, como este smbolo ha sido definido con otra funcion,
debemos recurrir a otra cosa. Los programadores ocupados del desarrollo de MATLAB
decidieron entonces utilizar los smbolos .* para hacer esta operacion. De hecho, se puede
emplear este smbolo antes de cualquier smbolo matematico para especificar a MATLAB
que la operacion en cuestion debe tener lugar sobre cada entrada del vector.
>> v.*b
ans =
2
8
18
>> v./b
ans =
0.5000
0.5000
0.5000
>> sin(v)
23
ans =
0.8415
0.9093
0.1411
>> log(v)
ans =
0
0.6931
1.0986
>> x = [0:0.1:100]
x =
Columns 1 through 7
(stuff deleted)
>> y = sin(x).*x./(1+cos(x));
>> plot(x,y)
>> plot(x,y,rx)
obtenemos la misma grafica pero las lneas son reempladas por puntos rojos en forma de
x. Para ver mas opciones del commando plot, podemos teclear
El comando help es, sin duda, el camino mas corto para estar seguro de la sintaxis de un
determinado comando de MATLAB.
La notacion compacta permitira realizar un gran numero de operaciones utilizando
pocos comandos. Veamos el siguiente ejemplo:
ans 3 by 1 3 24 Full No
b 3 by 1 3 24 Full No
coef 1 by 1001 1001 8008 Full No
v 3 by 1 3 24 Full No
x 1 by 1001 1001 8008 Full No
y 1 by 1000 1000 8000 Full No
ans =
0.0500
25
>> y = (y(2:1000)-y(1:999))./(x(3:1001)-x(1:999));
>> coef(3) = y(1);
>>
>>
1.4. Bucles
En esta seccion veremos como utilizar los bucles for y while. En primer lugar, dis-
cutiremos el uso del bucle for con ejemplos para operaciones fila sobre matrices. A con-
tinuacion, mostraremos el uso del bucle while.
El bucle for permite repetir ciertos comandos. Todas las estructuras de bucles en
MATLAB comienzan con una palabra clave (como for o while) y terminan con un end
(parece sencillo, no?). Veamos un ejemplo trivial:
j =
j =
j =
26
j =
>>
Otro ejemplo:
>> v = [1:3:10]
v =
1 4 7 10
v =
1 2 3 4
Este es un ejemplo simple y una demostracion bonita de como funcionan los bucles
for. Sin embargo, no se debe utilizar en la practica: la notacion utilizada en la primera
lnea es mucho mas rapida que el bucle. Un mejor ejemplo se presenta a continuacion,
donde realizamos operaciones sobre las filas de una matriz. Si queremos comenzar en
la segunda fila de una matriz y restar la fila previa y repetir esta operacion sobre las
siguientes filas, un bucle for puede ocuparse de esto:
>> A = [ [1 2 3] [3 2 1] [2 1 3]]
A =
27
1 3 2
2 2 1
3 1 3
>> B = A;
>> for j=2:3,
A(j,:) = A(j,:) - A(j-1,:)
end
A =
1 3 2
1 -1 -1
3 1 3
A =
1 3 2
1 -1 -1
2 2 4
B =
1 3 2
0 -4 -3
3 1 3
28
B =
1 3 2
0 -4 -3
0 -8 -3
B =
1 3 2
0 -4 -3
0 0 3
Las operaciones se repetiran mientras que las condiciones sean ciertas. Por ejemplo,
dado un numero a, el siguiente bloque permite calcular y mostrar el entero no negativo
mas pequeno tal que 2n a:
>> n=0;
>> while 2^n < a
n=n+1;
end
>> n
1.4.1. Relaciones
Los operadores de relacion en MATLAB son:
29
& y
| o
no
1.5. La instruccion if
La forma general de una instruccion if simple es:
>> if (condiciones)
(operaciones)
end
Las operaciones se realizaran unicamente si se cumplen las condiciones especificadas.
Se admiten las ramificaciones multiples como puede verse en el siguiente ejemplo:
>> if n <0
a=1;
elseif n<5
a=2;
else
a=3;
end
Si una tarea MATLAB la vamos a ejecutar muchas veces, es buena idea escribir un fichero
con estos comandos para poder ejecutarlos tantas veces como queramos.
La edicion del fichero ejecutable la realizamos con un editor cualquiera. Si nos resulta
mas comodo, podemos utilizar el editor que incorpora MATLAB y al que invocaremos
desde la lnea de comandos como:
>>edit
Los ficheros ejecutables de MATLAB (llamados ficheros M) deben tener como exten-
sion .m. En el ejemplo que damos a continuacion, crearemos un programa que calcula
el factorial de 6:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Este es un programa no muy util,
%que calcula el factorial de 6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=6; fac=1; for i=2:n
fac=fac*i;
end fac
Si guardamos esto en el fichero fac.m en el directorio de trabajo (o cualquier otro
incluido en el path) y tecleamos el comando fac, obtenemos
>> fac
fac =
720
Las lineas tras el smbolo % son lneas de comentario, que se conviene utilizar como
explicacion del programa. El comando help sirve para mostrar esas lneas:
>> help fac
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Este es un programa no muy util,
que calcula el factorial de 6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31
En efecto, este no es un programa muy util, en primer lugar porque el propio MAT-
LAB tiene su comando para calcular el factorial de numeros enteros:
)) factorial(6)
ans =
720
y en segundo lugar porque nuestro programa solo calcula el factorial de 6. Para poder
calcular el factorial para distintos numeros deberemos crea una subrutina o funcion MAT-
LAB.
1.7. Subrutinas
Si ahora escribimos en un fichero con nombre facf.m los siguientes comandos
habremos definido una funcion que podemos utilizar tal como lo hacemos con los comandos
intrnsecos de MATLAB. Por ejemplo, tecleando en la linea de comandos facf(6) tenemos:
>> facf(6)
ans =
720
Las funciones pueden tener varios parametros de entrada y/o salida. Por ejemplo,
la siguiente es una funcion que, dados dos vectores con la misma longitud, devuelve dos
valores (es decir, la subrutina implementa una funcion f : Rn Rn R2 ).
32
>> x=1:1:5
x =
1 2 3 4 5
>> y=0:0.1:0.4
y =
>> [f1,f2]=funci(x,y);
>> f1
f1 =
-0.7568
>> f2
f2 =
-41.6241
>> [a,b]=funci(1:1:5,0:1:4);
>> [a,b]=funci(1:1:5,0:1:5);
??? Error using ==> * Inner matrix dimensions must agree.
Importante:
function [output1,output2,...]=nombre(input1,input2,...)
Por supuesto, las funciones as definidas pueden ser utilizadas tantas veces como sea
necesario dentro de otras funciones y programas.
Una norma muy conveniente que conviene seguir es sera escribir todos los progra-
mas en ficheros de texto (utilizando un editor simple) y procurar que estos sean lo mas
estructurados posibles, utilizando subrutinas (funciones) para implementar tareas inde-
pendientes. Se trata de programar de la forma mas modular y estructurada posible.
puesto que cuando se utiliza en un fichero .m, interrumpe la ejecucion del mismo.
Podemos, asimismo, en un fichero .m pedir que un usuario introduzca datos de
forma interactiva utilizando la funcion input. Cuando, por ejemplo, durante la ejecucion
de un programa aparece la lnea
f ormat short Punto fijo y 4 decimales (es el que hay por defecto)
f ormat long Punto fijo y 14 decimales
f ormat short e notacion cientfica con 4 decimales
f ormat long e notacion cientfica con 14 decimales
35
1.11. Graficos
Aunque ya hemos mencionado anteriormente la utilizacion del comando plot, vamos
a dar en esta seccion algun detalle adicional sobre las posibilidades graficas de MATLAB.
MATLAB permite generar representaciones graficas de curvas en 2D y 3D. Los co-
mandos basicos con los que nos manejaremos seran plot, plot3, mesh y surf.
1.11.1. Representaciones en 2D
El comando plot crea graficos de curvas en el plano x-y; si x e y son vectores de la
misma longitud, el comando plot(x,y) abre una ventana grafica y dibuja en el plano x-y
los elementos de x versus los elementos de y. Podemos, por ejemplo, dibujar el grafico de
la funcion seno en el intervalo -4 a 4 con los siguientes comandos:
Entonces el comando
fplot(expcu,[-1.5,1.5])
title(Hola caracola)
axis([xmin,xmax,ymin,ymax])
dibuja una lnea discontinua y punteada, respectivamente, para los dos primeros graficos
mientras que el tercer grafico se muestra con el smbolo +. Los tipos de lnea y marca
son:
Tipos de lnea: solida (-), discontinua (), punteada (:), discontinua y punteada (-.)
Tipos de marca: punto (.), mas (+), estrella (*), crculo (o), x (x)
Se pueden especificar colores para los distintos tipos de lnea y marca:
Colores: amarillo (y), magenta (m), rojo (r), verde (g), azul (b), blanco (w), negro
(k)
El comando subplot puede utilizarse para hacer una particion de la terminal grafica,
de modo que pueden situarse varios subgraficos en una misma figura.
1.11.2. Representaciones en 3D
Graficos de lnea
El comando plot3 en 3 dimensiones es el analogo al comando plot en 2 dimensiones:
produce curvas en el espacio tridimensional. Si x, y y z son vectores del mismo tamano,
entonces el comando plot3(x,y,z) producira un grafico de perspectiva de la curva en el
espacio tridimensional que pasa por los puntos especificados por x, y y z. Estos vectores
suelen estar definidos de forma parametrica. Por ejemplo,
proporciona una helice que esta comprimida cerca del plano x-y.
mesh(eye(10))
surf(eye(10))
[x,y]=meshgrid(xx,yy);
Una vez hecho esto, obtenemos la matriz z haciendo actuar f sobre las matrices x
e y. La representacion de la matriz z se puede hacer acudiendo a los comandos mesh y
surf.
Veamos un ejemplo:
2 2
Vamos a dibujar el grafico de z = ex y sobre el cuadrado [2, 2] [2, 2] del
siguiente modo:
Las caractersticas del comando axis introducido previamente son aplicables tambien
a los graficos tridimensionales, as como lo son las de los comandos para ttulos, etiquetado
de ejes y el comando hold.
El color de las superficies se ajusta utilizando el comando shading. Hay 3 opciones
para este comando: faceted (el que esta por defecto), interpolated y flat. Se accede a
estas opciones tecleando:
hsv (por defecto), hot, cool, jet, pink, copper, flag, gray, bone
Introduccion a la construccion de
algoritmos
41
Captulo 2
43
44
Un numero en base q se denota como (an an1 ...a1 a0 .b1 b2 ...bk ...)q donde ai y bj pertenecen
al conjunto de los q dgitos elementales 1 . Estos q dgitos representaran valores desde 0
hasta q 1. La conversion a decimales es, por definicion:
(1011.01)2 = 1 23 + 0 22 + 1 21 + 1 20 + 0 21 + 1 22 = 11.25.
(an an1 ...a1 a0 .b1 b2 ...bk ...)q q = (an an1 ...a1 a0 b1 .b2 b3 ...bk ...)q
(2.2)
(an an1 ...a1 a0 .b1 b2 ...bk ...)q q 1 = (an an1 ...a1 .a0 b1 b2 ...bk ...)q
1
Vamos a utilizar el punto decimal (.) en lugar de la coma decimal ( ) para ser consistentes con los
ejemplos MATLAB.
45
Conversion entera
De (2.2) deducimos que:
que es una identidad entre numeros, que podemos evaluar en cualquier base, y en par-
ticular en base 10 (observese que de hecho mezclamos base numeros en distintas bases).
Vemos pues que al dividir un numero entero entre q el resto es el dgito menos significativo
del numero en base q. Dividiendo sucesivamente (hasta llegar al cociente 0) obtenemos
los sucesivos dgitos del numero en base q.
Conversion fraccionaria
A partir de (2.2) vemos que:
26 = 2 13 + 0 ; 13 = 2 6 + 1 ; 6 = 2 3 + 0 ; 3 = 2 1 + 1 ; 1 = 2 0 + 1
0.12 = 0.2 ; 0.22 = 0.4 ; 0.42 = 0.8 ; 0.80.2 = 1.6 ; 0.62 = 1.2 ; 0.22 = ...
(26.1)10 = (11010.00011)2
Esto nos debera prevenir de utilizar bucles que terminan cuando se alcanza cierto
valor concreto de una variable que involucra numeros no enteros.
Ejercicio 2.2. Si en la tercera lnea del anterior algoritmo cambiamos 0.1 por 0.125,
seguiramos teniendo un bucle infinito?.
47
Numeros no enteros
Para representar numeros con parte fraccionaria se utiliza el formato de punto (o
coma) flotante. Esta representacion es la correspondiente version binaria de la conocida
notacion cientfica o exponencial para los numeros decimales:
M 10E , 1 M < 10
pero utilizando base 2:
x = M 2E , 1 M < 2
donde M es la mantisa y E el exponente. Inevitablemente el numero de dgitos que se
pueden almacenar de la mantisa y exponente es limitado. Hay dos tipos de precision, la
simple y la doble, que difieren en el numero de bits de los que se dispone para almacenar
las cifras; la distribucion estandar es:
2. Precision doble
Ejemplo 2.1.3. Veamos de forma simplificada como se guardara el numero 5.5 en pre-
cision simple. Primero lo pasamos a binario: 5.5 = (101.1)2 y normalizamos para que la
mantisa 1 < M 2, de forma que 5.5 = (1.011)2 22 , que tiene exponente E = 2 (que
se guardara en binario), signo + (bit 0) y mantisa 1.011. Normalmente, salvo para el
caso del numero cero, que se almacenan de distinta forma, el numero delante del punto
sera siempre 1, por lo que no se suele almacenar.
0|E = 4|10011001100110011001101
donde la 23a cifra tras el punto se ha redondeado a 1 porque la siguiente era 1. De esta
forma, lo que realmente se almacena es:
(1.10011001100110011001101)2 24 = 0.10000000149011611938
Debemos resaltar que la especificacion del numero de bits que se utilizan para al-
macenar mantisa y exponente es lo unico que necesitamos para determinar cuales son
los mayores y menores numeros que se pueden almacenar en coma flotante as como la
maxima precision que se puede obtener. Veamos como obtener estos parametros en el caso
de doble precision (que es la precision utilizada por Matlab).
Nota 2.3. Es importante tener en cuenta que MATLAB trabaja en doble precision2
aunque por defecto solo muestre 5 cifras significativas. Para que el sistema muestre mas
cifras se puede utilizar el comando format long.
Ademas de los detalles senalados hay otras caractersticas fundamentales del estandar
IEEE que no describiremos como son:
3. Compatibilidad entre procesadores. Esta es por supuesto, una de las grandes ven-
tajas de los estandares.
2.2.1. Definiciones
Si xA es una aproximacion del verdadero valor xT , definimos entonces:
xA
Error relativo: Erel = |1 |, si xT 6= 0.
xT
Tambien se pueden utilizar estas definiciones con signo (es decir, sin el valor absoluto).
El error relativo en ocasiones se expresa tambien en tanto por ciento.
1. Un metodos numerico para resolver determinado problema cientfico puede dar lugar
a resultados erroneos si el modelo no es una fiel descripcion de la realidad.
4
No por ello se debe adoptar la vision reduccionista consistente en definir el analisis numerico como
el area de la matematica que analiza los errores de calculo
51
b N 1
h ba
Z X
f (x)dx (f (a)+f (b))+h f (a+kh) S(h) , donde h = , h = (b1)/N
a 2 k=1
N
donde (h) es el error de truncamiento, que es de esperar que sea menor cuanto menor
sea h (N N lo mayor posible). Un calculo explcito de los errores de truncamiento
es al menos igual de difcil que el calculo del problema original. Nos conformaremos
con un conocimiento cualitativo de estos errores y con buscar acotaciones lo mas
finas posible.
a) O bien reescribir la formula en cuestion de modo que se eviten las restas de cantidades
de la misma magnitud.
b) O bien utilizar (cuando sea posible) un desarrollo de Taylor para aproximar la formula
hasta la precision requerida.
1 cos(x)
Ejemplo 2.2.3. Consideremos g(x) = . Cuando se evalua g(x) para |x| << 1
x2
se produce una perdida considerable de cifras significativas. En este caso, para remediar
el problema consideramos el desarrollo de Taylor de cos(x) entorno a 0. De este modo:
6
Entonces, como
f (xT )
f (xT ) f (xA ) f (xt )(xT xA ) Erel (f (x)) (xT xA )
f (xT )
luego
f (xT )
C xT
f (xT )
Utilizaremos esta ultima expresion como definicion de condicion para funciones f (x)
de una variable real. Definimos entonces los numeros de condicion como
f (x)
C(x) = x
f (x)
Cuando para un x dado 0 < C(x) < 1 para ese x se dira que el problema (calculo
de f) esta bien condicionado (y cuanto menor sea C mejor condicionado), mientras que si
C(x) > 1 el problema estara mal condicionado. Si C(X) = 1, el error relativo se mantiene.
Ejemplo 2.3.1. La funcion f (x) = x esta bien condicionada, pues C(x) = 1/2, luego
el error relativo se reduce.
2
En cambio f (x) = x2 1 esta mal condicionada para x 1 pues C(x) = 22x
x 1
El concepto de condicionamiento se puede extender a situaciones mas generales que la
de una funcion de una variable continua. Por ejemplo, un problema clasico que involucra
funciones de una variable discreta, es el estudio del condicionamiento de relaciones de
recurrencia:
y vemos que C(x) < 1/2 para x > 0, luego la funcion esta bien condicionada (su error
relativo es menor que el error relativo en x).
Sin embargo, el algortmo
para
calcular x consistente en ir realizando las operaciones
implicadas en f (x) = x + 1 x, a saber:
1. Input: x
2. y = x + 1
3. f1 = x + 1
4. f2 = x
5. f = f1 f2
es inestable para x grande por culpa del paso 5 (hay cancelaciones entre numeros simi-
lares). Como sabemos, un algoritmo estable lo proporciona la siguiente reescritura de la
funcion:
1
f (x) =
x+1+ x
despreocuparnos por la rapidez de calculo. Esta es, sin embargo, una pesima filosofa: se
trata de aprovechar los recursos para poder resolver problemas mas complejos y no para
resolver peor problemas simples. La eficiencia es y siempre sera de importancia capital en
el desarrollo de buenos metodos numericos.
La diferencia en tiempos de ejecucion pueden llegar a ser muy considerables si ciertas
operaciones elementales, que se pueden repetir miles y miles de veces, no se realizan con
cuidado. Por ejemplo, para calcular x4 para cierto valor de x, es muy mala idea calcular
x4.0 (exponente en coma flotante); hay que tener cuidado en utilizar un exponente entero
ya que los metododos de exponenciacion en coma flotante son distintos que los de enteros
y mucho mas lentos; aun es mejor idea considerar el calculo en dos pasos: x2 = x x,
x4 = x2 x2 , con lo que se economizar un producto frente a x4 = x x x x.
1 + 2 + 3 + 4 + 5 + 6 = 21
y el numero de sumas es 6.
Una forma mejor de proceder es ir calculando primero las potencias de forma sucesiva:
x2 = x x , x 3 = x x 2 , x4 = x x 3 , x5 = x x 4 , x6 = x x 5
con lo que solo se anade una nueva multiplicacion por potencia, par un total de
1 + 2 + 2 + 2 + 2 + 2 = 11
Pero aun se puede hacer mejor reescribiendo
P (x) = a0 + a1 x + ... + an xn , an 6= 0
(1) bn = an
(n) b0 = a0 + z b1
donde P (z) = b0 .
Es facil programa este algoritmo en forma de bucle, sobretodo si no nos interesan los
calculos intermedios. As, se puede escribir:
(1) b = an
(3) n = n 1
(4) b = an + z b
(6) p(z) = b.
59
Esta forma de evaluar polinomios es mucho mejor que el metodo directo, especial-
mente para ordenes grandes. Dependiendo del orden de un polinomio y las veces que se
repita el calculo, sera importante aplicar el metodo de Horner.
60
>> a=1+2^(-53);b=a-1
y comparando con
>> a=1+2^(-52);b=a-1
x1 = L/2a , x2 = 2c/L
donde L = b signo(b) b2 4ac.
La sintaxis de la llamada a la funciones ha de ser
>> [x1,x2]=buena(a,b,c);
5. Escribir una rutina que implemente el algoritmo de Horner (horn.m) para la eval-
uacion de polinomios. La sintaxis de llamada a la rutina habra de ser:
>> p=horn(coefs,x);
donde p es el valor del polinomio, coefs es un vector con los coeficientes del poli-
nomio, de mayor a menor grado y x es el valor de la variable independiente. Es decir
que si, por ejemplo, hacemos: