Sei sulla pagina 1di 60

Introduccin al Mtodo de Diferencias Finitas y

su Implementacin Computacional

Antonio Carrillo Ledesma y Omar Mendoza Bernal


Facultad de Ciencias, UNAM
http://www.mmc.geofisica.unam.mx/acl/

Una copia de este trabajo se puede descargar de


http://www.mmc.geofisica.unam.mx/acl/Textos/

Invierno 2015, Versin 1.0


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

ndice
1 Expansin en Series de Taylor 2
1.1 Aproximacin de la Primera Derivada . . . . . . . . . . . . . . . 2
1.1.1 Diferencias Progresivas . . . . . . . . . . . . . . . . . . . . 2
1.1.2 Diferencias Regresivas . . . . . . . . . . . . . . . . . . . . 3
1.1.3 Diferencias Centradas . . . . . . . . . . . . . . . . . . . . 3
1.2 Derivadas de Ordenes Mayores . . . . . . . . . . . . . . . . . . . 4
1.2.1 Derivada de Orden Dos . . . . . . . . . . . . . . . . . . . 5
1.2.2 Derivadas de Ordenes Mayores . . . . . . . . . . . . . . . 5
1.3 Derivadas en Dos Dimensiones . . . . . . . . . . . . . . . . . . . 6
1.4 Derivadas en Tres Dimensiones . . . . . . . . . . . . . . . . . . . 7

2 Mtodo de Diferencias Finitas en Una Dimensin 10


2.1 Problema con Condiciones de Frontera Dirichlet . . . . . . . . . . 10
2.2 Problema con Condiciones de Frontera Neumann . . . . . . . . . 16
2.3 Problema con Condiciones de Frontera Robin . . . . . . . . . . . 17
2.4 Discretizacin del Tiempo . . . . . . . . . . . . . . . . . . . . . . 23
2.4.1 Ecuacin con Primera Derivada Temporal . . . . . . . . . 23
2.4.2 Ecuacin con Segunda Derivada Temporal . . . . . . . . . 27
2.5 Consistencia, Estabilidad, Convergencia y Error del Mtodo de
Diferencias Finitas . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3 Consideraciones Sobre la Implementacin de Mtodos de Solu-


cin de Grandes Sistemas de Ecuaciones Lineales 33
3.1 Mtodos Directos . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.1 Factorizacin LU . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.2 Factorizacin Cholesky . . . . . . . . . . . . . . . . . . . . 35
3.1.3 Factorizacin LU para Matrices Tridiagonales . . . . . . . 35
3.2 Mtodos Iterativos . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.1 Mtodo de Gradiente Conjugado . . . . . . . . . . . . . . 38
3.2.2 Mtodo Residual Mnimo Generalizado . . . . . . . . . . . 40
3.3 Estructura ptima de las Matrices en su Implementacin Com-
putacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3.1 Matrices Bandadas . . . . . . . . . . . . . . . . . . . . . . 43
3.3.2 Matrices Dispersas . . . . . . . . . . . . . . . . . . . . . . 44
3.3.3 Multiplicacin Matriz-Vector . . . . . . . . . . . . . . . . 45

4 Implementacin Computacional del Mtodo de Diferencias Fini-


tas para la Resolucin de Ecuaciones Diferenciales Parciales 47
4.1 Implementacin en SciLab . . . . . . . . . . . . . . . . . . . . . . 47
4.2 Implementacin en Octave (MatLab) . . . . . . . . . . . . . . . . 49
4.3 Implementacin en C++ . . . . . . . . . . . . . . . . . . . . . . . 51
4.4 Implementacin en Python . . . . . . . . . . . . . . . . . . . . . 53

5 Bibliografa 56

antoniocarrillo@ciencias.unam.mx 1 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

1 Expansin en Series de Taylor


Sea f(x) una funcin definida en (a, b) que tiene hasta la ksima derivada,
entonces la expansin de f(x) usando series de Taylor alrededor del punto xi
contenido en el intervalo (a, b) ser
  
(x xi ) df  (x xi )2 d2 f  (x xi )k dk f 
f (x) = f(xi ) + + + ... + (1.1)
1! dx xi 2! dx2 xi k! dxk 

donde = xi + (x xi ) y 0 < < 1.

1.1 Aproximacin de la Primera Derivada


Existen distintas formas de generar la aproximacin a la primera derivada, nos
interesa, una que nos de la mejor precisin posible con el menor esfuerzo com-
putacional.

1.1.1 Diferencias Progresivas


Considerando la Ec.(1.1) con k = 2 y x = xi + x, tenemos
 
df  x2 d2 f 
f(xi + x) = f(xi ) + x + (1.2)
dx xi 2! dx2 p

de esta ecuacin obtenemos la siguiente expresin para aproximacin de la


primera derivada
 
df  f(xi + x) f(xi ) x2 d2 f 
= (1.3)
dx xi x 2! dx2 p

en este caso la aproximacin de f (x) mediante diferencias progresivas es de


primer orden, o sea O(x). Siendo Op (x) el error local de truncamiento,
definido como 
x2 d2 f 
Op (x) = . (1.4)
2! dx2 p
Es comn escribir la anterior expresin como

df  f (xi + x) f (xi )
= Op (x) (1.5)
dx xi x
como
fi+1 fi
f (xi ) = (1.6)
x
para simplificar notacin.

antoniocarrillo@ciencias.unam.mx 2 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

1.1.2 Diferencias Regresivas


Considerando la Ec.(1.1) con k = 2 y x = xi x, tenemos
 
df  x2 d2 f 
f (xi x) = f (xi ) x + (1.7)
dx xi 2! dx2 r
de esta ecuacin obtenemos la siguiente expresin para aproximacin de la
primera derivada
 
df  f (xi ) f (xi x) x2 d2 f 
= (1.8)
dx xi x 2! dx2 r

en este caso la aproximacin de f (x) mediante diferencias regresivas es de


primer orden, o sea O(x). Siendo Or (x) el error local de truncamiento,
definido como 
x2 d2 f 
Or (x) = . (1.9)
2! dx2  r
Es comn escribir la anterior expresin como

df  f (xi ) f(xi x)
= + Or (x) (1.10)
dx xi x
como
fi fi1
f (xi ) = (1.11)
x
para simplificar notacin.

1.1.3 Diferencias Centradas


Considerando la Ec.(1.1) con k = 3 y escribiendo f(x) en x = xi + x y
x = xi x, tenemos
  
df  x2 d2 f  x3 d3 f 
f (xi + x) = f (xi ) + x + + (1.12)
dx xi 2! dx2 xi 3! dx3 p
y
  
df  x2 d2 f  x3 d3 f 
f(xi x) = f(xi ) x + (1.13)
dx xi 2! dx2 xi 3! dx3 r

restando la Ec.(1.12) de la Ec.(1.13), se tiene


    
df  x3 d3 f  d3 f 
f (xi + x) f (xi x) = 2x + + (1.14)
dx xi 3! dx3 p dx3 r

esta ltima expresin lleva a la siguiente aproximacin de la primera derivada


mediante diferencias centradas

df  f(xi + x) f(xi x)
 = + Oc (x2 ) (1.15)
dx xi 2x

antoniocarrillo@ciencias.unam.mx 3 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

con un error local de truncamiento de segundo orden Oc (x2 ), es decir


   
2 3  3 
x d f d f
Oc (x2 ) =  +  (1.16)
3! dx3 p dx3 r

comparado el error local de truncamiento de la aproximacin anterior Oc (x2 ),


con los obtenidos previamente para diferencias progresivas y regresivas Op (x)
y Or (x), se tiene que

lim Oc (x2 ) < lim Op (x). (1.17)


x0 x0

Es comn encontrar expresada la derivada1



df  f (xi + x) f (xi x)
= (1.18)
dx xi 2x
como
fi+1 fi1
f (xi ) = (1.19)
2x
para simplificar notacin.

Derivadas Usando Ms Puntos Utilizando el valor de la funcin en ms


puntos se construyen frmulas ms precisas para las derivadas2 , algunos ejem-
plos son
3fi + 4fi+1 fi+2
f (xi ) = + O(x2 ) (1.20)
2x
3fi 4fi1 + fi2
f (xi ) = + O(x2 )
2x
2fi+1 + 3fi 6fi1 + fi2
f (xi ) = + O(x3 )
6x
fi2 8fi1 + 8fi+1 fi+2
f (xi ) = + O(x4 )
12x
25fi + 48fi+1 36fi+2 + 16fi+3 3fi+4
f (xi ) = + O(x4 )
12x

1.2 Derivadas de Ordenes Mayores


De forma anloga se construyen aproximaciones en diferencias finitas de orden
mayor, aqu desarrollaremos la forma de calcular la derivada de orden dos en
diferencias centradas.
1 En el caso de que la derivada sea usada en una malla no homognea, es necesario incluir

en la derivada a que x se refiere, por ejemplo en cada punto i, tenemos la xi (por la


df  f (xi +xi )f (xi xi+ )
izquierda) y la xi+ (por la derecha), i.e. dx  = .
xi (xi )+(xi+ )
2 Al usar estas derivadas en el mtodo de diferencias finitas mostrado en la seccin (2) las

matrices generadas no sern tridiagonales.

antoniocarrillo@ciencias.unam.mx 4 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

1.2.1 Derivada de Orden Dos


Partiendo del desarrollo de Taylor
x2 x3 x4 (4)
f (xi +x) = f(xi )+xf (xi )+ f (xi )+ f (xi )+ f ( p ) (1.21)
2! 3! 4!
y
x2 x3 x4 (4)
f (xi x) = f(xi )xf (xi )+ f (xi ) f (xi )+ f ( r ) (1.22)
2! 3! 4!
y eliminado las derivadas primeras, sumando las ecuaciones anteriores y despe-
jando se encuentra que
f(xi x) 2f(xi ) + f(xi + x) x2 (4)
f (xi ) = f ( c ) (1.23)
x2 12
as, la aproximacin a la segunda derivada usando diferencias centradas con un
error de truncamiento Oc (x2 ) es
f(xi x) 2f (xi ) + f(xi + x)
f (xi ) = (1.24)
x2
Es comn escribir la anterior expresin como
fi1 2fi + fi+1
f (xi ) =
x2
para simplificar notacin.

Derivadas Usando Ms Puntos Utilizando el valor de la funcin en ms


puntos se construyen frmulas ms precisas para las derivadas, algunos ejemplos
son
fi+2 2fi+1 + fi
f (xi ) = + O(x) (1.25)
x2
fi+3 + 4fi+2 5fi+1 + 2fi
f (xi ) = + O(x2 )
x2
fi+2 + 16fi+1 30fi + 16fi1 fi2
f (xi ) = + O(x4 )
12x2

1.2.2 Derivadas de Ordenes Mayores


De forma anloga se construyen derivadas de ordenes mayores utilizando el valor
de la funcin en ms puntos, algunos ejemplos para derivadas terceras son
fi+3 3fi+2 + 3fi+1 fi
f (xi ) = + O(x) (1.26)
x3
fi+2 2fi+1 + 2fi1 fi2
f (xi ) = + O(x2 )
2x3
fi3 8fi2 + 13fi1 13fi+1 + 8fi+2 fi+3
f (xi ) = + O(x4 )
8x3

antoniocarrillo@ciencias.unam.mx 5 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Algunos ejemplos para derivadas cuartas son


fi+4 4fi+3 + 6fi+2 4fi+1 + fi
f (xi ) = + O(x) (1.27)
x4
fi+2 4fi+1 + 6fi 4fi1 + fi2
f (xi ) = + O(x2 )
x4
fi+3 + 12fi+2 39fi+1 + 56fi 39fi1 + 12fi2 fi3
f (xi ) = + O(x4 )
6x4

1.3 Derivadas en Dos Dimensiones


De forma anloga se construyen aproximaciones en diferencias finitas de primer y
segundo orden en dos dimensiones. Usando el teorema de Teylor para funciones
en dos variables x y y, es posible escribir de forma exacta para el punto xi y yj

f (xi , yj ) x 2 f (xi + 1 x, yj )
f(xi + x, yj ) = f (xi , yj ) + x +
x 2 x2
(1.28)
f (xi , yj ) y 2 f (xi , yj + 2 y)
f (xi , yj + y) = f (xi , yj ) + y + .
y 2 y 2
As, la aproximacin en diferencias hacia delante de f /x y f /y es
f (xi , yj ) f (xi + x, yj ) f (xi , yj )
(1.29)
x x
f (xi , yj ) f (xi , yj + y) f (xi , yj )

y y
o en su forma simplificada (para simplificar la notacin, asociamos x = h y
y = k), tenemos
f (xi , yj ) fi+1,j fi,j
(1.30)
x h
f (xi , yj ) fi,j+1 fi,j
.
y k
La aproximacin en diferencias hacia atrs de f /x y f /y es
f (xi , yj ) f (xi , yj ) f (xi x, yj )
(1.31)
x x
f (xi , yj ) f (xi , yj ) f (xi , yj y)

y y
o en su forma simplificada, tenemos
f (xi , yj ) fi,j fi1,j
(1.32)
x h
f (xi , yj ) fi,j fi,j1
.
y k

antoniocarrillo@ciencias.unam.mx 6 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

La aproximacin en diferencias centradas de f /x y f /y es

f (xi , yj ) f (xi + x, yj ) f (xi x, yj )


(1.33)
x 2x
f (xi , yj ) f (xi , yj + y) f (xi , yj y)

y 2y
o en su forma simplificada, tenemos

f (xi , yj ) fi+1,j fi1,j


(1.34)
x 2h
f (xi , yj ) fi,j+1 fi,j1
.
y 2k

Por otro lado, la aproximacin en diferencias centradas de 2 f/x2 y 2 f/y 2


es
2 f (xi , yj ) f (xi + x, yj ) 2f (xi , yj ) + f (xi x, yj )
(1.35)
x2 x2
2
f (xi , yj ) f (xi , yj + y) f (xi , yj ) + f (xi , yj y)

y2 y2
o en su forma simplificada, tenemos

2 f (xi , yj ) fi+1,j 2fi,j + fi1,j


(1.36)
x2 h2
2
f (xi , yj ) fi,j+1 2fi,j + fi,j1
.
y 2 k2

1.4 Derivadas en Tres Dimensiones


De forma anloga se construyen aproximaciones en diferencias finitas de primer y
segundo orden en tres dimensiones. Usando el teorema de Teylor para funciones
de tres variables x, y y z, es posible escribir de forma exacta para el punto xi , yj
y zk

f (xi , yj , zk ) x 2 f (xi + 1 x, yj , zk )
f(xi + x, yj , zk ) = f(xi , yj , zk ) + x +
x 2 x2
(1.37)
f (xi , yj , zk ) y 2 f (xi , yj + 2 y, zk )
f(xi , yj + y, zk ) = f(xi , yj , zk ) + y +
y 2 y 2
2
f (xi , yj , zk ) z f (xi , yj , zk + 3 z)
f (xi , yj , zk + z) = f(xi , yj , zk ) + z +
z 2 z 2
As, la aproximacin en diferencias hacia delante de f /x, f /y y f /z

antoniocarrillo@ciencias.unam.mx 7 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

es
f (xi , yj , zk ) f (xi + x, yj , zk ) f (xi , yj , zk )
(1.38)
x x
f (xi , yj , zk ) f (xi , yj + y, zk ) f (xi , yj , zk )

y y
f (xi , yj , zk ) f (xi , yj , zk + z) f (xi , yj , zk )

z z
o en su forma simplificada (para simplificar la notacin, asociamos x = h, y =
l y z = m), tenemos

f (xi , yj , zk ) fi+1,j,k fi,j,k


(1.39)
x h
f (xi , yj , zk ) fi,j+1,k fi,j,k

y l
f (xi , yj , zk ) fi,j,k+1 fi,j,k
.
z m
La aproximacin en diferencias hacia atrs de f /x, f /y y f /z es

f (xi , yj , zk ) f (xi , yj , zk ) f (xi x, yj , zk )


(1.40)
x x
f (xi , yj , zk ) f (xi , yj , zk ) f (xi , yj y, zk )

y y
f (xi , yj , zk ) f (xi , yj , zk ) f (xi , yj , zk z)

z z
o en su forma simplificada, tenemos

f (xi , yj , zk ) fi,j,k fi1,j,k


(1.41)
x h
f (xi , yj , zk ) fi,j,k fi,j1,k

y l
f (xi , yj , zk ) fi,j,k fi,j,k1
.
z m
La aproximacin en diferencias centradas de f /x, f/y y f /z es

f (xi , yj , zk ) f (xi + x, yj , zk ) f (xi x, yj , zk )


(1.42)
x 2x
f (xi , yj , zk ) f (xi , yj + y, zk ) f (xi , yj y, zk )

y 2y
f (xi , yj , zk ) f (xi , yj , zk + z) f (xi , yj , zk z)

z 2z

antoniocarrillo@ciencias.unam.mx 8 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

o en su forma simplificada, tenemos

f (xi , yj , zk ) fi+1,j,k fi1,j,k


(1.43)
x 2h
f (xi , yj , zk ) fi,j+1,k fi,j1,k

y 2l
f (xi , yj , zk ) fi,j,k+1 fi,j,k1
.
z 2m
Por otro lado, la aproximacin en diferencias centradas de 2 f /x2 , 2 f /y 2
y f /z 2 es
2

2 f (xi , yj , zk ) f (xi + x, yj , zk ) 2f (xi , yj , zk ) + f (xi x, yj , zk )



x2 x2
(1.44)
2 f (xi , yj , zk ) f (xi , yj + y, zk ) f (xi , yj , zk ) + f (xi , yj y, zk )

y 2 y2
2
f (xi , yj , zk ) f (xi , yj , zk + z) f (xi , yj , zk ) + f (xi , yj , zk z)

z 2 z 2
o en su forma simplificada, tenemos

2 f (xi , yj , zk ) fi+1,j,k 2fi,j,k + fi1,j,k


(1.45)
x2 h2
2
f (xi , yj , zk ) fi,j+1,k 2fi,j,k + fi,j1,k

y2 l2
2 f (xi , yj , zk ) fi,j,k+1 2fi,j,k + fi,j,k1
.
z 2 m2

antoniocarrillo@ciencias.unam.mx 9 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

2 Mtodo de Diferencias Finitas en Una Dimen-


sin
Consideremos la ecuacin diferencial parcial

(p (x) u (x)) + q (x) u (x) r (x) u (x) = f (x) (2.1)
en a x b donde: u (a) = u y u (b) = u
con condiciones de frontera Dirichlet o cualquier otro tipo de condiciones de
frontera. Para usar el procedimiento general de solucin numrica mediante el
mtodo de diferencias finitas, debemos de hacer:
1. Generar una malla del dominio, i.e. una malla es un conjunto finito de
puntos en los cuales buscaremos la solucin aproximada a la ecuacin
diferencial parcial.
2. Sustituir las derivadas correspondiente con alguna de las formulas de difer-
encias finitas centradas (vase secciones 1.1 y 1.2), en cada punto donde la
solucin es desconocida para obtener un sistema algebraico de ecuaciones
Au = f.
3. Resolver el sistema de ecuaciones (vase captulo 3), y as obtener la solu-
cin aproximada en cada punto de la malla.

2.1 Problema con Condiciones de Frontera Dirichlet


Consideremos un caso particular de la Ec.(2.1) definido por la ecuacin
u (x) = f (x), 0 x 1, u(0) = u , u(1) = u (2.2)
con condiciones de frontera Dirichlet. Para usar el procedimiento general de
solucin numrica mediante el mtodo de diferencias finitas, debemos de hacer:
1. Generamos una malla homognea del dominio3
1
xi = ih, i = 0, 1, ..., n, h= = x (2.3)
n
2. Sustituimos la derivada con Ec.(1.24) en cada punto donde la solucin es
desconocida para obtener un sistema algebraico de ecuaciones. As, en
cada punto xi de la malla aproximamos la ecuacin diferencial por4
u(xi h) 2u(x) + u(xi + h)
u (xi ) (2.4)
h2
3 En el caso de que la malla no sea homognea, es necesario incluir en la derivada a que

h se refiere, por ejemplo en cada punto i, tenemos la hi (por la izquierda) y la hi+ (por la
u(xi hi )2u(x)+u(xi +hi+ )
derecha), i.e. u (xi ) .
(hi )(hi+ )
4 Notemos que en cada punto de la malla, la aproximacin por diferencias finitas supone

la solucin de tres puntos de la malla xi1 , xi y xi+1 . Al conjunto de estos tres puntos de la
malla son comnmente llamados el estncil de diferencias finitas.

antoniocarrillo@ciencias.unam.mx 10 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

o en su forma simplificada
ui1 2ui + ui+1
u (xi ) (2.5)
h2

definiendo la solucin aproximada de u(x) en xi como ui como la solucin


del siguiente sistema lineal de ecuaciones
u 2u1 + u2
= f (x1 )
h2
u1 2u2 + u3
= f (x2 )
h2
..
.
ui1 2ui + ui+1
= f (xi ) (2.6)
h2
..
.
un3 2un2 + un1
= f (xn2 )
h2
un2 2un1 + u
= f (xn1 ).
h2

Este sistema de ecuaciones se puede escribir como un matriz A y los vec-


tores u y fde la forma

h22 1
h2 u1 f(x1 ) uh2
1
h22 1
h2 h2 u2 f (x2 )
1
h22 1
h2 h2 u3 f (x3 )
.. = .. .
.. .. ..
. . . .
.

1
h2
h22 1
h2
un2 f (xn2 )
u
1
h2
h22 un1 f(xn1 ) h2

factorizando 1/h2 del sistema lineal Au = f, tenemos



2 1 u1 f(x1 ) uh2
1 2 1 u2 f (x2 )

1 1 2 1
u3
f (x3 )

.. .. .. .. = .. .
h2 . . . . .

1 2 1 un2 f(xn2 )
u
1 2 un1 f(xn1 ) h2

esta ltima forma de expresar el sistema lineal algebraico asociado es


preferible para evitar problemas numricos al momento de resolver el
sistema lineal por mtodos iterativos (vase captulo 3.2) principalmente
cuando h 0.

antoniocarrillo@ciencias.unam.mx 11 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

3. Resolviendo el sistema de ecuaciones (vase captulo 3), obtenemos la solu-


cin aproximada en cada punto interior de la malla. La solucin completa
al problema la obtenemos al formar el vector


u u1 u2 u3 un2 un1 u .

Para el problema general dado por la Ec.(2.1)



(p (x) u (x)) + q (x) u (x) r (x) u (x) = f (x) (2.7)

en a x b donde: u (a) = u y u (b) = u


el trmino q (x) u (x) algunas veces es llamado el trmino advectivo5 si u es la

velocidad. Existen dos diferentes tcnicas de discretizacin que se detallan a


continuacin:

Si las funciones p(x), q(x) y r(x) son constantes, el esquema de diferencias


finitas centradas para todas las derivadas, este est dado por el estncil
ui1 2ui + ui+1 ui+1 ui1
pi 2
+ qi ri ui = fi i = 1, 2, ..., n. (2.8)
h 2h
donde la ventaja de esta discretizacin, es que el mtodo es de segundo
orden de exactitud. La desventaja es que los coeficientes de la matriz
generada pueden no ser diagonal dominante si r (x) > 0 y p (x) > 0.
Cuando la adveccin |p (x)| es grande, la ecuacin se comporta como la
ecuacin de onda.
Tomando las funciones p(x, t), q(x, t) y r(x, t) ms generales posibles, es
necesario hacer una discretizacin que garantice que el mtodo es de se-
gundo orden de exactitud, esto se logra mediante la siguiente discretizacin
para (p (x, t) u (x, t)) mediante

u x u (x + x, t) u (x, t)
p (x, t) p x + ,t (2.9)
x x 2 x

x u (x, t) u (x x, t)
p x ,t /x
2 x

entonces se tiene que

p(ui+1 , t) ui+1h+ui p (ui1,t ) ui u i1


ui+1 ui1
h
+ qi ri ui = fi (2.10)
h 2h
para i = 1, 2, ..., n, (vase [51] pg. 78 y 79).
5 Cuando la adveccin es fuerte, esto es cuando |q (x)| es grande, la ecuacin se comporta
como si fuera una ecuacin de onda.

antoniocarrillo@ciencias.unam.mx 12 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

El esquema mixto, en donde se usa el esquema de diferencias finitas cen-


tradas para el trmino de difusin y el esquema upwind para el trmino
de adveccin
ui1 2ui + ui+1 ui+1 ui1
pi 2
+ qi ri ui = fi , si qi 0
h h
(2.11)
ui1 2ui + ui+1 ui ui1
pi + qi ri ui = fi , si qi < 0
h2 h
el propsito es incrementar el dominio de la diagonal. Este esquema es de
orden uno de exactitud y es altamente recomendable su uso si |q (x)|
1/h, en caso de no usarse, se observar que la solucin numrica oscila
alrededor del cero.

Veamos unos ejemplos desarrollados en SCILAB6

Ejemplo 1 Sea

u (x) + u (x) = 0, 0 x 1, u(0) = 0, u(1) = 1

entonces el programa queda implementado como:


a=0; // Inicio dominio
c=1; // Fin dominio
M=50; // Particin
N=M-2; // Nodos interiores
h=(c-a)/(M-1); // Incremento en la malla
Y0=0; // Condicin inicial en el inicio del dominio
Y1=1; // Condicin inicial en el fin del dominio
A=zeros(N,N); // Matriz A
b=zeros(N); // Vector b

P=2/(h^2);
Q=-1/(h^2)+1/(2*h);
R=-1/(h^2)-1/(2*h);

// Primer renglon de la matriz A y vector b


A(1,1)=P;
A(1,2)=Q;
b(1)=-Y0*R;
// Renglones intermedios de la matriz A y vector b
for i=2:N-1
6 Scilab es un programa open source para el clculo numrico el cual provee un poderoso

ambiente de clculo para aplicaciones Cientficas y de Ingeniera [http://www.scilab.org].

antoniocarrillo@ciencias.unam.mx 13 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

A(i,i-1)=R;
A(i,i)=P;
A(i,i+1)=Q;
end
// Relglon final de la matriz A y vector b
A(N,N-1)=R;
A(N,N)=P;
b(N)=-Y1*Q;

// Resuleve el sistema lineal Ax=b


x=inv(A)*b;

// Prepara la graficacin
xx=zeros(M,1);
for i=1:M
xx(i)=a+h*(i-1);
end
yy=zeros(M,1);
yy(1)=Y0; // Condicin inicial
for i=1:N
yy(i+1)=x(i);
end
yy(M)=Y1; // Condicin inicial
// Grafica la solucin de la Ecuacin Diferencial Parcial en 1D
plot2d(xx,yy)

Ejemplo 2 Sea

u (x) = 2 cos (x) , 0 x 1, u(0) = 1, u(1) = 1

entonces el programa queda implementado como:


function y=LadoDerecho(x)
y=-%pi*%pi*cos(%pi*x);
endfunction

function y=SolucionAnalitica(x)
y=cos(%pi*x);
endfunction

a=-1; // Inicio dominio


c=2; // Fin dominio
M=100; // Particin
N=M-2; // Nodos interiores
h=(c-a)/(M-1); // Incremento en la malla
Y0=-1; // Condicin inicial en el inicio del dominio

antoniocarrillo@ciencias.unam.mx 14 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Y1=1; // Condicin inicial en el fin del dominio

A=zeros(N,N); // Matriz A
b=zeros(N); // Vector b
R=1/(h^2);
P=-2/(h^2);
Q=1/(h^2);
// Primer renglon de la matriz A y vector b
A(1,1)=P;
A(1,2)=Q;
b(1)=LadoDerecho(a)-Y0*R;
// Renglones intermedios de la matriz A y vector b
for i=2:N-1
A(i,i-1)=R;
A(i,i)=P;
A(i,i+1)=Q;
b(i)=LadoDerecho(a+h*(i-1));
end
// Relglon final de la matriz A y vector b
A(N,N-1)=R;
A(N,N)=P;
b(N)=LadoDerecho(a+h*N)-Y1*Q;

// Resuleve el sistema lineal Ax=b


x=inv(A)*b;

// Prepara la graficacin
xx=zeros(M,1);
zz=zeros(M,1);
for i=1:M
xx(i)=a+h*(i-1);
zz(i)=SolucionAnalitica(xx(i));
end
yy=zeros(M,1);
yy(1)=Y0; // Condicin inicial
for i=1:N
yy(i+1)=x(i);
end
yy(M)=Y1; // Condicin inicial
// Grafica la solucin de la Ecuacin Diferencial Parcial en 1D
plot2d(xx,[yy,zz])

antoniocarrillo@ciencias.unam.mx 15 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

2.2 Problema con Condiciones de Frontera Neumann


Consideremos el problema
u (x) = f (x), 0x1 (2.12)
con condiciones de frontera Neumann
du du
= cte1 en u(0) y = cte2 en u(1)
dx dx
para usar el procedimiento general de solucin numrica mediante el mtodo
de diferencias finitas, primeramente debemos de discretizar las condiciones de
frontera, una manera seria usar para la primera condicin de frontera una aprox-
imacin usando diferencias progresivas Ec.(1.5)

du  u(xi + h) u(xi )
=
dx xi h
quedando
u1 u0
= cte1 (2.13)
h
para la segunda condicin de frontera una aproximacin usando diferencias re-
gresivas Ec.(1.10) 
du  u(xi ) u(xi h)
 =
dx xi h
quedando
un un1
= cte2 (2.14)
h
pero el orden de aproximacin no seria el adecuado pues estamos aproximando el
dominio con diferencias centradas con un error local de truncamiento de segundo
orden Oc (x2 ), en lugar de ello usaremos diferencias centradas Ec.(1.15) para
tener todo el dominio con el mismo error local de truncamiento.
Para usar diferencias centradas Ec.(1.15)

du  u(xi + h) u(xi h)
 =
dx xi 2h
en el primer nodo necesitamos introducir un punto de la malla ficticio x1 =
(x0 x) con un valor asociado a u1 , entonces
u1 u1
= cte1 (2.15)
2h
as tambin, en el ltimo nodo necesitamos introducir un punto de la malla
ficticio xn+1 = (xn + x) con un valor asociado a un+1 , obteniendo
un+1 un1
= cte2 . (2.16)
2h
Estos valores no tienen significado fsico alguno, dado que esos puntos se en-
cuentran fuera del dominio del problema. Entonces debemos de hacer:

antoniocarrillo@ciencias.unam.mx 16 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

1. Generamos una malla homognea del dominio


1
xi = ih, i = 0, 1, ..., n, h= = x. (2.17)
n

2. Sustituimos la derivada con Ec.(1.24) en cada punto donde la solucin es


desconocida para obtener un sistema algebraico de ecuaciones. As, en
cada punto xi de la malla aproximamos la ecuacin diferencial por

u(xi h) 2u(x) + u(xi + h)


u (xi ) (2.18)
h2
definiendo la solucin aproximada de u(x) en xi como ui como la solucin
del siguiente sistema lineal de ecuaciones
u1 u1
= cte1
2h
u0 2u1 + u2
= f (x1 )
h2
..
.
ui1 2ui + ui+1
= f (xi ) (2.19)
h2
..
.
un2 2un1 + un
= f (xn1 )
h2
un+1 un1
= cte2 .
2h

3. Resolviendo el sistema de ecuaciones (vase captulo 3), obtenemos la


solucin aproximada en cada punto de la malla.

2.3 Problema con Condiciones de Frontera Robin


El mtodo de un punto de la malla ficticio es usado para el manejo de las
condiciones de frontera mixtas, tambin conocidas como condiciones de frontera
Robin. Sin perdida de generalidad, supongamos que en x = a, tenemos

u (a) + u (b) =

donde = 0. Entonces usando el punto de la malla ficticio, tenemos que


u1 u1
+ un =
2h
o
2 2h
u1 = u1 + un

antoniocarrillo@ciencias.unam.mx 17 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

introduciendo esto en trminos de diferencias finitas centradas, en x = x0 ,


entonces se tiene que

2 2 2 2
2+ un + 2 u1 = f0 +
h h h h
o
1 1 f0
2+ un + 2 u1 = +
h h h 2 h
lo que genera coeficientes simtricos en la matriz.

Consideremos el problema

u (x) = f (x), 0x1 (2.20)

con condiciones de frontera Dirichlet y Neumman


du
u(0) = u y = cte1 en u(1).
dx
respectivamente. Para usar el procedimiento general de solucin numrica me-
diante el mtodo de diferencias finitas, primeramente debemos de expresar la
condicin de frontera Neumann mediante diferencias centradas Ec.(1.15)

du  u(xi + h) u(xi h)
=
dx xi 2h

en el ltimo nodo necesitamos introducir un punto de la malla ficticio xn+1 =


(xn + x) con un valor asociado a un+1 quedando
un+1 un1
= cte2 . (2.21)
2h
Este valor no tiene significado fsico alguno, dado que este punto se encuentra
fuera del dominio del problema.
Entonces debemos de hacer:

1. Generamos una malla homognea del dominio


1
xi = ih, i = 0, 1, ..., n, h= = x. (2.22)
n

2. Sustituimos la derivada con Ec.(1.24) en cada punto donde la solucin es


desconocida para obtener un sistema algebraico de ecuaciones. As, en
cada punto xi de la malla aproximamos la ecuacin diferencial por

u(xi h) 2u(x) + u(xi + h)


u (xi ) (2.23)
h2

antoniocarrillo@ciencias.unam.mx 18 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

definiendo la solucin aproximada de u(x) en xi como ui como la solucin


del siguiente sistema lineal de ecuaciones
u 2u1 + u2
= f (x1 )
h2
u1 2u2 + u3
= f (x2 )
h2
..
.
ui1 2ui + ui+1
= f (xi ) (2.24)
h2
..
.
un2 2un1 + un
= f (xn1 )
h2
un+1 un1
= cte1 .
2h

3. Resolviendo el sistema de ecuaciones (vase captulo 3), obtenemos la


solucin aproximada en cada punto de la malla. La solucin completa
al problema la obtenemos al formar el vector


u u1 u2 u3 un2 un1 un .

Veamos unos ejemplos desarrollados en SCILAB7

Ejemplo 3 Sea

u (x) = 2 cos (x) , 0 x 0.5, u(0) = 1, u (0.5) =

entonces el programa queda implementado como:


function y=LadoDerecho(x)
y=-%pi*%pi*cos(%pi*x);
endfunction

function y=SolucionAnalitica(x)
y=cos(%pi*x);
endfunction

a=0; // Inicio dominio


c=0.5; // Fin dominio
M=40; // Particin
N=M-1; // Nodos interiores
h=(c-a)/(M-1); // Incremento en la malla
Y0=1; // Condicin Dirchlet inicial en el inicio del dominio
7 Scilab es un programa open source para el clculo numrico el cual provee un poderoso

ambiente de clculo para aplicaciones Cientficas y de Ingeniera [http://www.scilab.org].

antoniocarrillo@ciencias.unam.mx 19 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Y1=-%pi; // Condicin Neumann inicial en el fin del dominio


A=zeros(N,N); // Matriz A
b=zeros(N); // Vector b

R=1/(h^2);
P=-2/(h^2);
Q=1/(h^2);

// Primer renglon de la matriz A y vector b


A(1,1)=P;
A(1,2)=Q;
b(1)=LadoDerecho(a)-Y0*R; // Frontera Dirichlet
// Renglones intermedios de la matriz A y vector b
for i=2:N-1
A(i,i-1)=R;
A(i,i)=P;
A(i,i+1)=Q;
b(i)=LadoDerecho(a+h*(i-1));
end
// Relglon final de la matriz A y vector b
A(N,N-1)=-1/(h^2);
A(N,N)=-1/(h^2);
b(N)=Y1/h; // Frontera Neumann

// Resuleve el sistema lineal Ax=b


x=inv(A)*b;

// Prepara la graficacin
xx=zeros(M,1);
zz=zeros(M,1);
for i=1:M
xx(i)=a+h*(i-1);
zz(i)=SolucionAnalitica(xx(i));
end
yy=zeros(M,1);
yy(1)=Y0; // Condicin inicial
for i=1:N
yy(i+1)=x(i);
end
// Grafica la solucin de la Ecuacin Diferencial Parcial en 1D
plot2d(xx,[yy,zz])

antoniocarrillo@ciencias.unam.mx 20 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Ejemplo 4 Sea

u (x) k2 u(x) = 0, 0 x 1, u(0) = 1, u (1) = iku(1)

con k = 150, entonces el programa queda implementado como8 :


TEST = 1; // (0) Diferencias finitas, (1) Diferencias finitas exactas segun
Yau Shu Wong y Guangrui Li

function y=LadoDerecho(x)
y=0.0;
endfunction

function y=SolucionAnalitica(x, k)
//y=cos(k*x)+%i*sin(k*x);
y=exp(%i*k*x);
endfunction

K = 150;
KK = K*K;
a=0; // Inicio dominio
c=1; // Fin dominio
M=300; // Particin
N=M-1; // Nodos interiores
h=(c-a)/(M-1); // Incremento en la malla
Y0=1; // Condicin Dirchlet inicial en el inicio del dominio
Y1=%i*K; // Condicin Neumann inicial en el fin del dominio

A=zeros(N,N); // Matriz A
b=zeros(N); // Vector b

if TEST = 0 then
R=-1/(h^2);
P=2/(h^2)-KK;
Q=-1/(h^2);
else
R=-1/(h^2);
P=(2*cos(K*h)+(K*h)^2)/(h^2) - KK;
Q=-1/(h^2);
end
8

Esta ecuacin se conoce como la ecuacin de Helmholtz la cual es dificil de


resolver si r (x) 0 y |r (x)| es grande, i.e. r (x) 1/h2 . Para resolver dicha
ecuacin, se usa diferencias finitas y diferencias finitas exactas, procedimiento
desarrollado en: Exact Finite Difference Schemes for Solving Helmholtz equation
at any wavenumber, Yau Shu Wong and Guangrui Lim International Journal of
Numerical Analysis and Modeling, Volumen 2, Number 1, Pages 91-108, 2011.

antoniocarrillo@ciencias.unam.mx 21 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

// Primer renglon de la matriz A y vector b


A(1,1)=P;
A(1,2)=Q;
b(1)=LadoDerecho(a)-Y0*R; // Frontera dirichlet
// Renglones intermedios de la matriz A y vector b
for i=2:N-1
A(i,i-1)=R;
A(i,i)=P;
A(i,i+1)=Q;
b(i)=LadoDerecho(a+h*(i-1));
end
// Relglon final de la matriz A y vector b
if TEST = 0 then
A(N,N-1)=1/(h^2);
A(N,N)=-1/(h^2)+ Y1/h;
b(N)=LadoDerecho(c)/2;
else
A(N,N-1)=1/(h^2);
A(N,N)=-1/(h^2)+ %i*sin(K*h)/(h^2);
b(N)=LadoDerecho(c)/2;
end

// Resuleve el sistema lineal Ax=b


x=inv(A)*b;

ESC = 5;
xxx=zeros(M*ESC,1);
zzz=zeros(M*ESC,1);
for i=1:M*ESC
xxx(i)=a+h/ESC*(i-1);
zzz(i)=SolucionAnalitica(xxx(i),K);
end
// Prepara la graficacin
xx=zeros(M,1);
zz=zeros(M,1);
for i=1:M
xx(i)=a+h*(i-1);
zz(i)=SolucionAnalitica(xx(i),K);
end
yy=zeros(M,1);
yy(1)=Y0; // Condicin inicial
for i=1:N
yy(i+1)=x(i);
end
// Grfica la solucin de la Ecuacin Diferencial Parcial en 1D
plot2d(xx,yy,15)

antoniocarrillo@ciencias.unam.mx 22 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

plot2d(xxx,zzz)

2.4 Discretizacin del Tiempo


Hasta ahora se ha visto como discretizar la parte espacial de las ecuaciones
diferenciales parciales, lo cual nos permite encontrar la solucin esttica de los
problemas del tipo elptico. Sin embargo, para ecuaciones del tipo parablico e
hiperblico dependen del tiempo, se necesita introducir una discretizacin a las
derivadas con respecto del tiempo. Al igual que con las discretizaciones espa-
ciales, podemos utilizar algn esquema de diferencias finitas en la discretizacin
del tiempo.

2.4.1 Ecuacin con Primera Derivada Temporal


Para la solucin de la ecuaciones diferenciales con derivada temporal (ut ), se
emplean diferentes esquemas en diferencias finitas para la discretizacin del
tiempo. Estos esquemas se conocen de manera general como esquemas theta().
Definiendo la ecuacin diferencial parcial general de segundo orden como

ut = Lu (2.25)

donde

Lu = (p (x) u (x)) + q (x) u (x) r (x) u (x) f (x) (2.26)
aqu, los coeficientes p, q y r pueden depender del espacio y del tiempo. Entonces
el esquema theta est dado por

ut = (1 ) (Lu)j + (Lu)j+1 . (2.27)

Existen diferentes casos del esquema theta a saber:

Para = 0, se obtiene un esquema de diferencias finitas hacia delante


en el tiempo, conocido como esquema completamente explicito, ya que el
paso n + 1 se obtiene de los trminos del paso anterior n. Es un esquema
2
sencillo, el cual es condicionalmente estable cuando t x2 .

Para = 1, se obtiene el esquema de diferencias finitas hacia atrs en


el tiempo, conocido como esquema completamente implcito, el cual es
incondicionalmente estable.
Para = 12 , se obtiene un esquema de diferencias finitas centradas en el
tiempo, conocido como esquema Crank-Nicolson, este esquema es tambin
incondicionalmente estable y es ms usado por tal razn.

Para la implementacin del esquema Crank-Nicolson se toma una diferencia


progresiva para el tiempo y se promedian las diferencias progresivas y regresivas

antoniocarrillo@ciencias.unam.mx 23 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

en el tiempo para las derivadas espaciales. Entonces si tenemos la Ec. (2.26),


las discretizaciones correspondientes son:

uj+1 uji
ut i
(2.28)
t
 j j j j+1 j+1 j+1

p ui1 2ui + ui+1 ui1 2ui + ui+1
(p (x) u (x)) + (2.29)
2 x2 x2
 j j j+1 j+1

q ui1 + ui+1 ui1 + ui+1
q (x) u (x) + (2.30)
2 2x 2x

adems de r(x)uji y fij .


Entonces, una vez que se sustituyen las derivadas por su forma en diferencias
finitas, lo siguiente es formar el sistema

Auj+1 = Buj + f j (2.31)

esto se logra, colocando del lado izquierdo la igualdad de los trminos que con-
tengan el paso del tiempo correspondiente a j + 1 y del lado derecho a los
correspondientes trminos de j.
A continuacin, veamos un ejemplo del esquema Crank-Nicolson desarrolla-
dos en SCILAB9

Ejemplo 5 Sea

ut a(x)u (x) b(x)u (x) + c(x)u = f, l0 x l, 0<t<T

entonces el programa queda implementado como:


// Crank-Nicolson
// Para una EDP de segundo orden
// u_t + a(x)u_xx + b(x)u_x +c(x)u = f
// Dominio
// l0<x<l
// 0<t<T
// Condiciones de frontera Dirichlet
// u(0,t) = u(l,t) = constante 0 < t < T cond de frontera
// Condicion inicial
// u(x,0) = g(x) l0 <= x <= l
// Datos de entrada
// intrevalo [l0, l]
// entero m>=3
// entero N>=1
// Salida
// aproximaciones w_ij a u(x_i,t_j)
9 Scilab es un programa open source para el clculo numrico el cual provee un poderoso

ambiente de clculo para aplicaciones Cientficas y de Ingeniera [http://www.scilab.org].

antoniocarrillo@ciencias.unam.mx 24 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

// Funciones de los coeficientes


function y = a(x)
y = -1;
endfunction
function y = b(x)
y = 0;
endfunction
function y = c(x)
y = 0;
endfunction
function y = f(x)
y = 0;
endfunction
// funcion de la condicion inicial
function y = condicion_inicial(x)
y = sin(x * %pi);
endfunction
// Condiciones de frontera
// Solo Dirichlet
cond_izq = 0;
cond_der = 0;
// Datos de entrada
l0 = 0;l = 1; // intervalo [0,1]
m = 11; // Numero de nodos
M = m - 2; // Nodos interiores
// Division del espacio y del tiempo
h = (l - l0)/(m-1);
k = 0.025; // Paso del tiempo
N = 50; // Numero de iteraciones
// Aw^(j+1) = Bw^j + f^j
// creo el vector w donde se guradara la solucion para cada tiempo
// A matriz del lado izquierdo
// B matriz del lado derecho
// B_prima para guardar el resultado de Bw^j
// ff que es el vector de los valores de f en cada nodo
w = zeros(M,1);
ff = zeros(M,1)
A = zeros(M,M);
B = zeros(M,M);
//B_prima = zeros(M,1);
w_sol = zeros(m,m)
// Se crea el espacio de la solucion o malla
espacio = zeros(M,1)
for i = 1:m
xx = l0 + (i-1)*h;
espacio(i) = xx;

antoniocarrillo@ciencias.unam.mx 25 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

end
disp(espacio, "Espacio")
// Condicion inicial
for i=1:M
w(i) = condicion_inicial(espacio(i+1));
end
w_sol(1) = cond_izq;
for kk = 1:M
w_sol(kk + 1) = w(kk);
end
w_sol(m) = cond_izq;
plot(espacio, w_sol);
disp(w, "Condiciones iniciales")
// primer renglon de cada matriz
A(1,1) = 1/k - a(l0 + h)/(h*h);
A(1,2) = a(l0 + h)/(2*h*h) + b(l0 + h)/(4*h) ;
B(1,1) = 1/k + a(l0 + h)/(h*h) - c(l0 + h);
B(1,2) = - a(l0 + h)/(2*h*h) - b(l0 + h)/(4*h);
ff(1) = f(l0 + h) - cond_izq;
// se completa las matrices desde el renglon 2 hasta el m-2
for i = 2:M-1
A(i, i-1) = a(l0 + i*h)/(2*h*h) - b(l0 + i*h)/(4*h) ;
A(i,i) = 1/k - a(l0 + i*h)/(h*h);
A(i,i+1) = a(l0 + i*h)/(2*h*h) + b(l0 + i*h)/(4*h) ;
B(i, i-1) = - a(l0 + i*h)/(2*h*h) + b(l0 + i*h)/(4*h);
B(i,i) = 1/k + a(l0 + i*h)/(h*h) - c(l0 + i*h);
B(i,i+1) = - a(l0 + i*h)/(2*h*h) - b(l0 + i*h)/(4*h);
end
// Ultimo renglon de cada matriz
A(M,M-1) = a(l - h)/(2*h*h) - b(l-h)/(4*h) ;
A(M,M) = 1/k - a(l - h)/(h*h);
B(M,M-1) = - a(l-h)/(2*h*h) + b(l-h)/(4*h);
B(M,M) = 1/k + a(l-h)/(h*h) - c(l-h);
ff(M) = f(l - h) - cond_der;
// Resolvemos el sistema iterativamente
for j=1:21
t = j*k;
B_prima = B * w + ff;
w = inv(A) * B_prima;
disp(t, "tiempo")
disp(w, "Sol")
w_sol(1) = cond_izq;
for kk = 1:M
w_sol(kk + 1) = w(kk);
end
w_sol(m) = cond_izq;

antoniocarrillo@ciencias.unam.mx 26 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

plot(espacio, w_sol);
end

2.4.2 Ecuacin con Segunda Derivada Temporal


Para el caso de ecuaciones con segunda derivada temporal, esta se aproxima
por diferencias finitas centradas en el tiempo, partiendo de la Ec. (2.26), las
discretizaciones correspondientes son:
uj1 2uji + uj+1
utt i i
(2.32)
t2
 j 
ui1 2uji + uji+1
(p (x) u (x)) p (2.33)
x2
 j 
ui1 + uji+1
q (x) u (x) q (2.34)
2x
adems de r(x)uji y fij .
Entonces, una vez que se sustituyen las derivadas por su forma en diferencias
finitas, lo siguiente es formar el sistema
uj+1
i = 2uji uj1
i + (t)2 Buj (2.35)
esto se logra, colocando del lado izquierdo la igualdad de los trminos que con-
tengan el paso del tiempo correspondiente a j + 1 y del lado derecho a los
correspondientes trminos de j y j 1. Para calcular uj+1 i es necesario conocer
ui1 , ui , ui+1 en los dos instantes inmediatos anteriores, i.e. tj y tj1 .
En particular para calcular u1i es necesario conocer u0i y u1
i , si consideramos

uj+1
i = 2uji uj1
i + (t)2 Luj (2.36)
para j = 0, entonces
2
u1i = 2u0i u1
i + (t) Lu
0
(2.37)
u1i u1
de donde tenemos u0i es la condicin inicial y 2t es la primer derivada de
i

la condicin inicial, as tenemos que para el primer tiempo tenemos


u1i = u(xi , 0) + tu (xi , 0) + (t)2 Lu0

(2.38)
lo cual permite calcular u1i a partir de las condiciones iniciales.

La derivacin del mtodo parte de


utt = Luj (2.39)
uj1 2uji + uj+1
i
2
i
= Luj
(t)
uj+1
i = 2uji uj1
i + (t)2 Luj
donde el error intrnseco a la discretizacin es de orden cuadrtico, pues se ha
usado diferencias centradas, tanto para el espacio como para el tiempo.

antoniocarrillo@ciencias.unam.mx 27 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Ejemplo 6 Sea

utt 4u (x) = 0, 0 x l, 0<t<T

sujeta a

u(0, t) = u(1, t) = 0, u(x, 0) = sin(x), ut (x, 0) = 0

con solucin analtica

u(x, t) = sen(x) cos(2t)

entonces el programa queda implementado como:


// Dominio
a_ = 0
b_ = 1
// Particion en x
m = 101; // numero de nodos
h = (b_ - a_)/(m-1)
dt = 0.001 // salto del tiempo
// Para que sea estable se debe cumplir que
// sqrt(a) <= h/dt
// Coeficiente
function y = a(x)
y = -4;
endfunction
// Condicion inicial
function y = inicial(x)
y = sin(%pi * x)
endfunction
function y = u_t(x)
y = 0;
endfunction
// Solucion analitica
function y = analitica(x,t)
y = sin(%pi * x) * cos(2* %pi * t)
endfunction
////////////////////////////////////
// Aw^(j+1) = Bw^j
// creo el vector w donde se guradaria la solucion para cada tiempo
// A matriz del lado izquierdo
// B matriz del lado derecho
// B_prima para guardar el resultado de Bw^j
w_sol = zeros(m,1);
w_sol_temp = zeros(m,1);
w_temp = zeros(m,1);
w = zeros(m,1);

antoniocarrillo@ciencias.unam.mx 28 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

w_ = zeros(m,1);
A = eye(m,m);
B = zeros(m,m);
B_prima = zeros(m,1);
espacio = zeros(m,1)
sol = zeros(m,1);
// primer renglon de cada matriz
B(1,1) = 2*a(a_)*dt*dt/(h*h)
B(1,2) = -a(a_)*dt*dt/(h*h)
// se completa las matrices desde el renglon 2 hasta el m-1
for i = 2:m-1
B(i, i-1) = -a(i*h)*dt*dt/(h*h)
B(i,i) = 2*a(i*h)*dt*dt/(h*h)
B(i,i+1) = -a(i*h)*dt*dt/(h*h)
end
// Ultimo renglon de cada matriz
B(m,m-1) = -a(b_)*dt*dt/(h*h)
B(m,m) = 2*a(b_)*dt*dt/(h*h)
// muestro la matriz
//printf("Matriz B\n");
//disp(B);
for i=1:m
xx = (i-1)*h;
espacio(i) = a_ + xx;
w(i) = inicial(espacio(i)); // Condiciones iniciales
w_(i) = inicial(espacio(i)) + u_t(espacio(i)) * dt
end
//
//disp(espacio)
//disp(w)
////////////
//Para t = 0
B_prima = B * w;
for i = 1:m
w_sol(i) = w_(i) + B_prima(i);
end
////////////
printf("w para t = 0\n");
disp(w_sol);
for i = 1:m
sol(i) = analitica(espacio(i), 0)
end
printf("Solucion analitica para t = 0\n")
disp(sol)
plot(espacio,w_sol)
//plot(espacio,sol,r)

antoniocarrillo@ciencias.unam.mx 29 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

w_sol_temp = w_sol;
w_temp = w
for i=1:500
t = i*dt
B_prima = B * w_sol_temp;
w_ = 2 * w_sol_temp - w_temp
w_sol = w_ + B_prima;
////
// for j = 1:m
// sol(j) = analitica(espacio(j), t)
// end
//
// printf("Sol analitica dt = %f", t)
// disp(sol)
// printf("Sol metodo dt = %f", t)
// disp(w_sol)
w_temp = w_sol_temp
w_sol_temp = w_sol
if i == 5 | i == 50 | i == 100 | i == 150 | i == 200 | i == 250 | i ==
300 | i== 350 | i == 400 | i == 450 | i == 500 then
plot(espacio,w_sol)
end
//plot(espacio,sol,r)
end

2.5 Consistencia, Estabilidad, Convergencia y Error del


Mtodo de Diferencias Finitas
Cuando se usa algn mtodo para la resolucin de ecuaciones diferenciales, se
necesita conocer cuan exacta es la aproximacin obtenida en comparacin con
la solucin analtica (en caso de existir).

Error Global Sea U = [U1 , U2 , ..., Un ]T el vector solucin obtenido al uti-


lizar el mtodo de diferencias finitas y u = [u (x1 ) , u (xn ) , ..., u (xn )] la solucin
exacta de los puntos de la malla. El vector de error global se define como
E = U u. lo que se desea es que el valor mximo sea pequeo. Usualmente se
utilizan distintas normas para encontrar el error.

La norma infinito, definida como E = max |ei |


n

La norma-1, definida como E1 = |ei |
i=1
 n  12

La norma-2, definida como E2 = e2i
i=1

antoniocarrillo@ciencias.unam.mx 30 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

La norma infinito E es en general, la ms apropiada para calcular los


errores relativos a la discretizacin.

Definicin 7 Si E Chp , p > 0, decimos que el mtodo de diferencias finitas


es de orden-p de precisin.

Definicin 8 Un mtodo de diferencias finitas es llamado convergente si

lim E = 0. (2.40)


h0

Error de Truncamiento Local Sea el operador diferencia Lu, definimos el


operador en diferencias finitas Lh , por ejemplo para la ecuacin de segundo
orden u (x) = f (x), una de los operadores de diferencias finitas puede ser

u(x h) 2u(x) + u(x + h)


Lh u(x) = . (2.41)
h2
Definicin 9 El error de truncamiento local es definido como

T (x) = Lu Lh u. (2.42)

Para la ecuacin diferencial u (x) = f(x) y el esquema de diferencias cen-


tradas usando tres puntos u(xh)2u(x)+u(x+h)
h2 , el error de truncamiento local
es
u(x h) 2u(x) + u(x + h)
T (x) = Lu Lh u = u (x) (2.43)
h2
u(x h) 2u(x) + u(x + h)
= f (x) .
h2
Note que el error de truncamiento local slo depende de la solucin del
estncil en diferencias finitas (en el ejemplo es usando tres puntos) pero no
depende de la solucin global, es por ello que se denomina error de truncamiento
local. Este es una medida de que tanto la discretizacin en diferencias finitas se
aproxima a la ecuacin diferencial.

Definicin 10 Un esquema de diferencias finitas es llamado consistente si

lim T (x) = lim (Lu Lh u) = 0. (2.44)


h0 h0

Si T (x) = Chp , p > 0, entonces se dice que la discretizacin es de ordenp


de precisin, donde C es una constante independiente de h pero puede depender
de la solucin de u(x). Para conocer cuando un esquema de diferencias finitas es
consistente o no, se usa la expansin de Taylor. Por ejemplo, para el esquema
de diferencias finitas centradas usando tres puntos para la ecuacin diferencial
u (x) = f (x), tenemos que

u(x h) 2u(x) + u(x + h) h2 (4)


T (x) = u (x) = u (x) + ... = Ch2 (2.45)
h2 12

antoniocarrillo@ciencias.unam.mx 31 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

1 (4)
donde C = 12 u (x). Por lo tanto, este esquema de diferencias finitas es con-
sistente y la discretizacin es de segundo orden de precisin.
La consistencia no puede garantizar un esquema de diferencias finitas tra-
baje. Para ello, necesitamos determinar otra condicin para ver si converge o
no. Tal condicin es llamada la estabilidad de un mtodo de diferencias finitas.
Para el problema modelo, tenemos que

Au = F + T, AU = F, A (u U) = T = AE (2.46)

donde A son los coeficientes de la matriz de las ecuaciones en diferencias finitas,


F son los trminos modificados por la condicin de frontera, y T es el vector
local de truncamiento en los puntos de la malla.    
Si la matriz A es no singular, entonces E = A1 T  A1  T  . Para
 1 
el esquema de diferencias finitas centradas, tenemos que E = A  h2 . Tal

que el error global depende del error de truncamiento local y A1  .

Definicin 11 Un mtodo de diferencias finitas para la ecuacin diferencial


elptica es estable si A es invertible y
 1 
A  C, para todo h h0 (2.47)

donde C y h0 son constantes.

Teorema 12 Si el mtodo de diferencias finitas es estable y consistente, en-


tonces es convergente.

antoniocarrillo@ciencias.unam.mx 32 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

3 Consideraciones Sobre la Implementacin de


Mtodos de Solucin de Grandes Sistemas de
Ecuaciones Lineales
Los modelos matemticos de muchos sistemas en Ciencia e Ingeniera y en par-
ticular una gran cantidad de sistemas continuos geofsicos requieren el proce-
samiento de sistemas algebraicos de gran escala. En este trabajo se muestra
como proceder, para transformar un problema de ecuaciones diferenciales par-
ciales en un sistema algebraico de ecuaciones lineales; y as, poder hallar la
solucin a dicho problema al resolver el sistema lineal, estos sistemas lineales
son expresados en la forma matricial siguiente
Au = f (3.1)
donde la matriz A es de tamao n n y generalmente bandada, cuyo tamao
de banda es b.

Los mtodos de resolucin del sistema algebraico de ecuaciones Au = f se


clasifican en dos grandes grupos (vase [14]): los mtodos directos y los mtodos
iterativos. En los mtodos directos la solucin u se obtiene en un nmero fijo
de pasos y slo estn sujetos a los errores de redondeo. En los mtodos itera-
tivos, se realizan iteraciones para aproximarse a la solucin u aprovechando las
caractersticas propias de la matriz A, tratando de usar un menor nmero de
pasos que en un mtodo directo (vase [10], [11], [12] y [14]).
Por lo general, es conveniente usar libreras10 para implementar de forma
eficiente a los vectores, matrices bandadas y dispersas y resolver los sistemas
lineales.

3.1 Mtodos Directos


En los mtodos directos (vase [10] y [13]), la solucin u se obtiene en un nmero
fijo de pasos y slo estn sujetos a errores de redondeo. Entre los mtodos ms
importantes se puede considerar: Factorizacin LU para matrices simtricas
y no simtricas y Factorizacin Cholesky para matrices simtricas. En
todos los casos la matriz original A es modificada y en caso de usar la Facto-
rizacin LU el tamao de la banda b crece a 2b + 1 si la factorizacin se realiza
en la misma matriz.

3.1.1 Factorizacin LU
Sea U una matriz triangular superior obtenida de A por eliminacin bandada.
Entonces U = L1 A, donde L es una matriz triangular inferior con unos en la
1 0 Algunas de las libreras ms usadas para resolver sistemas lineales usando matrices ban-

dadas y dispersar son PETCs, HYPRE, ATLAS, LAPACK++, LAPACK, EISPACK, LIN-
PACK, BLAS, entre muchas otras alternativas, tanto para implementaciones secuenciales
como paralelas y ms recientemente para hacer uso de los procesadores CUDA en las GPU de
nVidia.

antoniocarrillo@ciencias.unam.mx 33 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

diagonal. Las entradas de L1 pueden obtenerse de los coeficientes Lij y pueden


ser almacenados estrictamente en las entradas de la diagonal inferior de A ya
que estas ya fueron eliminadas. Esto proporciona una Factorizacin LU de A
en la misma matriz A ahorrando espacio de memoria, donde el ancho de banda
cambia de b a 2b + 1.
En el algoritmo de Factorizacin LU, se toma como datos de entrada del
sistema Au = f, a la matriz A, la cual ser factorizada en la misma matriz,
esta contendr a las matrices L y U producto de la factorizacin, quedando el
mtodo numrico esquemticamente como:

Para i = 1, 2, ..., n {
Para j = 1, 2, ..., n {
Aji = Aji /Aii
Para k = i + 1, ..., n {
(3.2)
Ajk = Ajk Aji Aik
}
}
}

El problema original Au = f se escribe como LU u = f , donde la bsqueda de


la solucin u se reduce a la solucin sucesiva de los sistemas lineales triangulares

Ly = f y Uu = y. (3.3)

Pero recordando que la matriz A contiene a las matrices L y U entonces se tiene


que

Ly = f


y1 =
f1 /A11
i1
 (3.4)
y = fi Aij yj para toda i = 2, ..., n
i

j=1

Uu = y


xn = y
n /Ann
n
 .(3.5)
1
u = yi Aij xj para toda i = n 1, ..., 1
i
Aii
j=i+1

La descomposicin LU requiere11 n3 /3 n/3 multiplicaciones/divisiones y


n /3 n2 /2 + n/6 sumas/restas del orden O(N 3 /3) operaciones aritmticas
3

1 1 Notemos
que el mtodo de eliminacin gaussiana de una matriz A de tamao nn requiere
n3 /3 + n2 n/3 multiplicaciones/divisiones adems de n3 /3 + n2 /2 5n/6 sumas/restas. El
mtodo de Gauss-Jordan requiere n3 /2 + n2 n/2 multiplicaciones/divisiones adems de
n3 /2 + n/2 sumas/restas.

antoniocarrillo@ciencias.unam.mx 34 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

para la matriz llena pero slo del orden O(N b2 ) operaciones aritmticas para
la matriz con un ancho de banda de b. La solucin de los sistemas Ly = f
y Uu = y requieren n2 /2 n/2 operaciones aritmticas cada uno (vase [10] y
[13]).

3.1.2 Factorizacin Cholesky


Cuando la matriz es simtrica y definida positiva, se obtiene la descomposicin
LU de la matriz A = LDU = LDLT donde D = diag(U ) es la diagonal con
entradas positivas.
En el algoritmo de Factorizacin Cholesky, se toma como datos de entrada
del sistema Au = f, a la matriz A, la cual ser factorizada en la misma matriz y
contendr a la matrz L, mientras LT no se calcula, quedando el mtodo numrico
esquemticamente como:

Aii = A11
Para j = 2, ..., n calcule Aj1 = Aj1 /A11
Para i = 2,
..., n {
 i1
 
Aii = Aii A2ik
k=1
Para j = i +
 1, ..., ni1  (3.6)

Aji = Aji Ajk Aik /Aii
k=1
} 
 n1
 
Ann = Ann (Ank )2
k=1

El problema original Au = f se escribe como LLT u = b, donde la bsqueda


de la solucin u se reduce a la solucin sucesiva de los sistemas lineales triangu-
lares
Ly = f y LT u = y (3.7)
usando la formulacin equivalente dada por las Ec.(3.4) y (3.5) para la descom-
posicin LU.
La descomposicin LDLT requiere de n3 /6+n2 7n/6 multiplicaciones/divisi-
ones adems de n3 /6 n/6 sumas/restas mientras que para la factorizacin
Cholesky se requieren n3 /6 + n2 /2 2n/3 multiplicaciones/divisiones adems
de n3 /6 n/6 sumas/restas, adicionalmente se requiere del clculo de n races
cuadradas (vase [10] y [13]).

3.1.3 Factorizacin LU para Matrices Tridiagonales


Como un caso particular de la Factorizacin LU, est el mtodo de Crout o
Thomas y este es aplicable cuando la matriz slo tiene tres bandas la diagonal

antoniocarrillo@ciencias.unam.mx 35 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

principal, una antes y una despus de la diagonal principal la Factorizacin


LU se simplifica considerablemente, en este caso las matrices L y U tambin
se dejan en la matriz A y despus de la factorizacin, se resuelven los sistemas
Ly = f y U u = y, quedando el mtodo numrico esquemticamente como:

A12 = A12 /A11


y1 = A1,n+1 /A11
Para i = 2, ..., n 1 {
Aii = Aii Ai,i1 Ai1,i
Ai,i+1 = Ai,i+1 /Aii
yi = (Ai,n+1 Ai,i1 yi1 ) /Aii (3.8)
}
Ann = Ann An,n1 An1,n
yn = (An,n+1 An,n1 yn1 ) /Ann
un = yn
Para i = n 1, ..., 1 tome ui = yi Ai,i+1 ui+1

Esta factorizacin y la resolucin del sistema Au = f requiere slo (5n 4)


multiplicaciones/divisiones y (3n 3) sumas/restas, en contraste con la descom-
posicin LU que requiere n3 /3n/3 multiplicaciones/divisiones y n3 /3n2 /2+
n/6 sumas/restas.

3.2 Mtodos Iterativos


En los mtodos iterativos, se realizan iteraciones para aproximarse a la solucin
u aprovechando las caractersticas propias de la matriz A, tratando de usar un
menor nmero de pasos que en un mtodo directo (vase [10] y [13]).
En los mtodos iterativos tales como Jacobi, Gauss-Seidel y de Relajacin
Sucesiva (SOR) en el cual se resuelve el sistema lineal

Au = f (3.9)

comienza con una aproximacin inicial u0 a la solucin u y genera una sucesin



de vectores uk k=1 que converge a u. Los mtodos iterativos traen consigo
un proceso que convierte el sistema Au = f en otro equivalente mediante la
iteracin de punto fijo de la forma u = T u + c para alguna matriz fija T y un
vector c. Luego de seleccionar el vector inicial u0 la sucesin de los vectores de
la solucin aproximada se genera calculando

uk = T uk1 + c k = 1, 2, 3, ... (3.10)

La convergencia a la solucin la garantiza el siguiente teorema (vase [14]).


 
Teorema 13 Si T  < 1, entonces el sistema lineal u = T u + c tiene una solu-
cin nica u y las iteraciones uk definidas por la frmula uk = T uk1 +c k =
1, 2, 3, ... convergen hacia la solucin exacta u para cualquier aproximacin ini-
cial u0 .

antoniocarrillo@ciencias.unam.mx 36 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Ntese que, mientras menor sea la norma de la matriz T , ms rpida es la


convergencia, en el caso cuando T  es menor que uno, pero cercano a uno, la
convergencia es lenta y el nmero de iteraciones necesario para disminuir el error
depende significativamente del error inicial. En este caso, es deseable proponer
al vector inicial u0 de forma tal que sea mnimo el error
  inicial. Sin embargo,
la eleccin de dicho vector no tiene importancia si la T  es pequea, ya que la
convergencia es rpida.
Como es conocido, la velocidad de convergencia de los mtodos iterativos
dependen de las propiedades espectrales de la matriz de coeficientes del sistema
de ecuaciones, cuando el operador diferencial L de la ecuacin del problema a
resolver es auto-adjunto se obtiene una matriz simtrica y positivo definida y el
nmero de condicionamiento de la matriz A, es por definicin

max
cond(A) = 1 (3.11)
min
donde max y min es el mximo y mnimo de los eigen-valores de la matriz
A. Si el nmero de condicionamiento es cercano a 1 los mtodos numricos
al solucionar el problema converger en pocas iteraciones, en caso contrario se
requerirn muchas iteraciones.
Frecuentemente al usar el mtodo de Elemento Finito,! Diferencias
" Finitas,
entre otros, se tiene una velocidad de convergencia de O h12 y en el caso de
mtodos de descomposicin
! " de dominio sin precondicionar se tiene una velocidad
de convergencia de O h1 , donde h es la mxima distancia de separacin entre
nodos continuos de la particin, es decir, que poseen una pobre velocidad de
convergencia cuando h 0 (vase [8], [9], [10] y [14]).
Los mtodos Jacobi y Gauss-Seidel son usualmente menos eficientes que los
mtodos discutidos en el resto de esta seccin basados en el espacio de Krylov
(vase [41] y [13]). Para un ejemplo de este hecho, tomemos el sistema lineal

4 3 0 x1 24
3 4 1 x2 = 30
0 1 4 x3 24

cuya solucin es x1 = 3, x2 = 4, x3 = 5 ; para el mtodo Gauss-Seidel se


requirieron 50 iteraciones, Jacobi requirieron 108 iteraciones y Gradiente Con-
jugado slo 3 iteraciones.
Los mtodos basados en el espacio de Krylov, minimizan en la k-sima ite-
racin alguna medida de error sobre el espacio afn x0 + Kk , donde x0 es la
iteracin inicial y Kk es el k-simo subespacio de Krylov
# $
Kk = Generado r0 , Ar0 , ..., Ak1 r0 para k 1. (3.12)

El residual es r = b Ax, tal rk k0
denota la sucesin de residuales

rk = b Axk . (3.13)

antoniocarrillo@ciencias.unam.mx 37 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Entre los mtodos ms usados definidos en el espacio de Krylov para el tipo


de problemas tratados en el presente trabajo se puede considerar: Mtodo de
Gradiente Conjugado para matrices simtricas y GMRES para matrices
no simtricas.

3.2.1 Mtodo de Gradiente Conjugado


Si la matriz generada por la discretizacin es simtrica A = AT y definida
positiva uT Au > 0 para todo u = 0, entonces es aplicable el mtodo de Gra-
diente Conjugado Conjugate Gradient Method (CGM). La idea bsica en
que descansa el mtodo del Gradiente Conjugado ! consiste
" en construir una base
de vectores ortogonales espacio de Krylov Kn A, vn y utilizarla para realizar
la bsqueda de la solucin en forma lo ms eficiente posible.
Tal forma de proceder generalmente no sera aconsejable porqu la construc-
cin de una base ortogonal utilizando el procedimiento de Gramm-Schmidt re-
quiere, al seleccionar cada nuevo elemento de la base, asegurar su ortogonalidad
con respecto a cada uno de los vectores construidos previamente. La gran ven-
taja del mtodo de Gradiente Conjugado radica en que cuando se utiliza este
procedimiento, basta con asegurar la ortogonalidad de un nuevo miembro con
respecto al ltimo que se ha construido, para que automticamente esta condi-
cin se cumpla con respecto a todos los anteriores.
En el algoritmo de Gradiente Conjugado, se toma a la matriz A como
simtrica y positiva definida, y como datos de entrada del sistema Au = f ,
el vector de bsqueda inicial u0 y se calcula r0 = f Au0 , p0 = r0 , quedando
el mtodo numrico esquemticamente como:

pn ,pn 
n =
pn ,Apn 
n+1
u = un + n pn
n+1
r = rn n Apn
Prueba de convergencia (3.14)
rn+1 ,rn+1 
n = rn ,rn 
pn+1 = rn+1 + n pn
n=n+1

donde ,  = (, ) ser el producto interior adecuado al sistema lineal en par-


ticular, la solucin aproximada ser un+1 y el vector residual ser rn+1 .
En la implementacin numrica y computacional del mtodo es necesario
realizar la menor cantidad de operaciones posibles por iteracin, en particular
en Apn , una manera de hacerlo queda esquemticamente como:
Dado el vector de bsqueda inicial u, calcula r = f Au, p = r y = r r.

Para n = 1, 2, ...,Mientras ( < ) {


v = Ap

= pv
u = u + p

antoniocarrillo@ciencias.unam.mx 38 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

r = r v
= r r

=
p = r + p
=
}
La solucin aproximada ser u y el vector residual ser r.
N
Si se denota con {i , Vi }i=1 las eigen-soluciones de A, i.e. AVi = i Vi ,
i = 0, 1, 2, ..., N. Ya que la matriz A es simtrica, los eigen-valores son reales y
se pueden ordenar 1 2 ... N . Se define el nmero de condicin por
Cond(A) = N /1 y la norma de la energa asociada a A por u2A = u Au
entonces %
2k
    1 Cond(A)
u uk  u u0  % . (3.15)
A A
1 + Cond(A)

El siguiente teorema da idea del espectro de convergencia del sistema Au = b


para el mtodo de Gradiente Conjugado.
Teorema 14 Sea = cond(A) = maxmin
1, entonces el mtodo de Gradiente
Conjugado satisface la Anorma del error dado por
n
en  2 1
& 'n & 'n  2 (3.16)
e0  +1
+1 + +1
1 1

donde em = u um del sistema Au = b.


Ntese que para grande se tiene que

1 2
1 (3.17)
+1
tal que
  n
en A e0 A exp 2 (3.18)


de lo anterior se puede esperar un espectro de convergencia del orden de O( )
iteraciones (vase [14] y [41]).
Definicin 15 Un mtodo iterativo para la solucin de un sistema lineal es lla-
mado ptimo, si la razn de convergencia a la solucin exacta es independiente
del tamao del sistema lineal.
Definicin 16 Un mtodo para la solucin del sistema lineal generado por
mtodos de descomposicin de dominio es llamado escalable, si la razn de con-
vergencia no se deteriora cuando el nmero de subdominios crece.

antoniocarrillo@ciencias.unam.mx 39 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

3.2.2 Mtodo Residual Mnimo Generalizado


Si la matriz generada por la discretizacin es no simtrica, entonces una opcin,
es el mtodo Residual Mnimo Generalizado Generalized Minimum Residual
Method (GMRES), este representa una formulacin iterativa comn satisfa-
ciendo una condicin de optimizacin. La idea bsica detrs del mtodo se basa
en construir una base ortonormal
 1 2
v , v , ..., vn (3.19)
! " ! "
para el espacio de Krylov Kn A, vn . Para hacer vn+1 ortogonal a Kn A, v n ,
 n+1j n
es necesario usar todos los vectores previamente construidos v j=1
en
la prctica slo se guardan algunos vectores anteriores en los clculos. Y el
algoritmo se basa en una modificacin del mtodo
de Gram-Schmidt
para la
generacin de una base ortonormal. Sea V n = v1 , v2 , ..., v n la cual denota la
matriz conteniendo vj en la j-sima columna, para j = 1, 2, ..., n, y sea H n =
[hi,j ] , 1 i, j n, donde las entradas de H n no especificadas en el algoritmo
son cero. Entonces, H n es una matriz superior de Hessenberg. i.e. hij = 0 para
j < i 1, y


AV n = V n H n + hn+1,n 0, ..., 0, vn+1 (3.20)
Hn = H Tn AV n .

En el algoritmo del mtodo Residual Mnimo Generalizado, la matriz A es


tomada como no simtrica, y como datos de entrada del sistema

Au = f (3.21)
 
el vector de bsqueda inicial u0 y se calcula r0 = f Au0 , 0 = r0  , v1 =
r0 / 0 , quedando el mtodo esquemticamente como:

Para n = 1, 2, ..., Mientras n < 0 {


wn+1
0 = Avn
Para l = 1 hasta
( n+1n {l )
hl,n = wl , v
wn+1
l+1 = w l
n+1
hl,n vl
} (3.22)
 
hn+1,n = wn+1 n+1

n+1 n+1
v = wn+1 /hn+1,n  
 
Calcular y n tal que n =  0 e1 H n y n  es mnima
}

donde H n = [hij ]1in+1,1jn , la solucin aproximada ser un = u0 + V n y n ,


y el vector residual ser
& '
rn = r0 AV n y n = V n+1 0 e1 H n y n . (3.23)

antoniocarrillo@ciencias.unam.mx 40 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Teorema 17 Sea uk la iteracin generada despus de k iteraciones de GMRES,


con residual rk . Si la matriz A es diagonalizable, i.e. A = V V 1 donde es
una matriz diagonal de eigen-valores de A, y V es la matriz cuyas columnas son
los eigen-vectores, entonces
 k
r 
(V ) min max |p (j )| (3.24)
r0  p ,pk (0)=1 j

V 
donde (V ) = es el nmero de condicionamiento de V .
V 1 

3.3 Estructura ptima de las Matrices en su Implementacin


Computacional
Una parte fundamental de la implementacin computacional de los mtodos
numricos de resolucin de sistemas algebraicos, es utilizar una forma ptima
de almacenar12 , recuperar y operar las matrices, tal que, facilite los clculos que
involucra la resolucin de grandes sistemas de ecuaciones lineales cuya imple-
mentacin puede ser secuencial o paralela (vase [13]).
El sistema lineal puede ser expresado en la forma matricial Au = f , donde la
matriz A que puede ser real o virtual es de tamao n n con banda b, pero
el nmero total de datos almacenados en ella es a los ms n b nmeros de doble
precisin, en el caso de ser simtrica la matriz, el nmero de datos almacenados
es menor a (n b)/2. Adems si el problema que la origin es de coeficientes
constantes el nmero de valores almacenados se reduce drsticamente a slo el
tamao de la banda b.
En el caso de que el mtodo para la resolucin del sistema lineal a usar
sea del tipo Factorizacin LU o Cholesky, la estructura de la matriz cambia,
amplindose el tamao de la banda de b a 2 b + 1 en la factorizacin, en el caso
de usar mtodos iterativos tipo CGM o GMRES la matriz se mantiene intacta
con una banda b.
Para la resolucin del sistema lineal virtual asociada a los mtodos de difer-
encias finitas, la operacin bsica que se realiza de manera reiterada, es la
multiplicacin de una matriz por un vector v = Cu, la cual es necesario realizar
de la forma ms eficiente posible.
Un factor determinante en la implementacin computacional, para que esta
resulte eficiente, es la forma de almacenar, recuperar y realizar las operaciones
que involucren matrices y vectores, de tal forma que la multiplicacin se realice
en la menor cantidad de operaciones y que los valores necesarios para realizar
dichas operaciones queden en la medida de lo posible contiguos para ser alma-
cenados en el Cache13 del procesador.
1 2 En el caso de los ejemplos de la seccin (4) de MatLab y C++ se usan matrices que

minimizan la memoria usada en el almacenamiento de las matrices y maximizan la eficiencia


de los mtodos numricos de solucin del sistema lineal asociado.
1 3 Ntese que la velocidad de acceso a la memoria principal (RAM) es relativamente lenta

con respecto al Cache, este generalmente est dividido en sub-Caches L1 de menor tamao y

antoniocarrillo@ciencias.unam.mx 41 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Dado que la multiplicacin de una matriz C por un vector u, dejando el


resultado en v se realiza mediante el algoritmo

for (i=0; i<ren; i++)


{
s = 0.0;
for (j=0; j < col; j++)
{
s += C[i][j]*u[j];
}
v[i] = s;
}

Para lograr una eficiente implementacin del algoritmo anterior, es necesario


que el gran volumen de datos desplazados de la memoria al Cache y viceversa
sea mnimo. Por ello, los datos se deben agrupar para que la operacin ms
usada en este caso multiplicacin matriz por vector se realice con la menor
solicitud de datos a la memoria principal, si los datos usados rengln de la
matriz se ponen contiguos minimizar los accesos a la memoria principal, pues
es ms probable que estos estarn contiguos en el Cache al momento de realizar
la multiplicacin.
Por ejemplo, en el caso de matrices bandadas de tamao de banda b, el
algoritmo anterior se simplifica a

for (i=0; i<ren; i++)


{
s= 0.0;
for (k=0; k < ban; k++)
{
if ((Ind[k] + i) >= 0 && (Ind[k]+i) < ren)
s += Dat[i][k]*u[Ind[k]+i];
}
v[i]=s;
}

Si, la solicitud de memoria para Dat[i] se hace de tal forma que los datos del
rengln estn continuos son b nmeros de punto flotante, esto minimizar
los accesos a la memoria principal en cada una de las operaciones involucradas
en el producto, como se explica en las siguientes secciones.
el ms rpido, L2 y hasta L3 el ms lento y de mayor tamao los cuales son de tamao
muy reducido con respecto a la RAM.
Por ello, cada vez que las unidades funcionales de la Unidad de Aritmtica y Lgica requieren
un conjunto de datos para implementar una determinada operacin en los registros, solicitan
los datos primeramente a los Caches, estos consumen diversa cantidad de ciclos de reloj para
entregar el dato si lo tienen pero siempre el tiempo es menor que solicitarle el dato a la
memoria principal; en caso de no tenerlo, se solicitan a la RAM para ser cargados a los
caches y poder implementar la operacin solicitada.

antoniocarrillo@ciencias.unam.mx 42 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

3.3.1 Matrices Bandadas


En el caso de las matrices bandadas de banda b sin prdida de generalidad y
para propsitos de ejemplificacin se supone pentadiagonal tpicamente tiene
la siguiente forma

a1 b1 c1
d2 a2 b2 c2

d3 a3 b3 c3

d4 a4 b4 c4


A = e5 d5 a5 b5 c5
(3.25)
e6 d6 a6 b6

e7 d7 a7 b7

e8 d8 a8 b8
e9 d9 a9

la cual puede ser almacenada usando el algoritmo (vase [13]) Compressed Dia-
gonal Storage (CDS), optimizado para ser usado en C++, para su almace-
namiento y posterior recuperacin. Para este ejemplo en particular, se har uso
de un vector de ndices

Ind = [5, 1, 0, +1, +5] (3.26)

y los datos sern almacenados usando la estructura



0 0 a1 b1 c1
0 d2 a2 b2 c2

0 d3 a3 b3 c3

0 d4 a4 b4 c4

Dat =
e5 d5 a5 b5 c5
(3.27)
e6 d6 a6 b6 0

e7 d7 a7 b7 0

e8 d8 a8 b8 0
e9 d9 a9 0 0
de tal forma que la matriz A puede ser reconstruida de forma eficiente. Para
obtener el valor Ai,j , calculo ind = j i, si el valor ind esta en la lista de
ndices Ind supngase en la columna k, entonces Ai,j = Datik , en otro caso
Ai,j = 0.

Casos Particulares de la Matriz Bandada A Bsicamente dos casos par-


ticulares surgen en el tratamiento de ecuaciones diferenciales parciales: El primer
caso es cuando el operador diferencial parcial es simtrico y el otro, en el que
los coeficientes del operador sean constantes.
Para el primer caso, al ser la matriz simtrica, slo es necesario almacenar
la parte con ndices mayores o iguales a cero, de tal forma que se buscara el
ndice que satisfaga ind = |j i| , reduciendo el tamao de la banda a b/2 en la
matriz A.

antoniocarrillo@ciencias.unam.mx 43 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

Para el segundo caso, al tener coeficientes constantes el operador diferencial,


los valores de los renglones dentro de cada columna de la matriz son iguales, y
slo es necesario almacenarlos una sola vez, reduciendo drsticamente el tamao
de la matriz de datos.

3.3.2 Matrices Dispersas


Las matrices dispersas de a lo ms b valores distintos por rengln sin prdida
de generalidad y para propsitos de ejemplificacin se supone b = 3 que surgen
en mtodos de descomposicin de dominio para almacenar algunas matrices,
tpicamente tienen la siguiente forma

a1 b1 c1
a2 b2 c2

a 3 b3 c3


a4 b4


A= a5 b5 c5 (3.28)
a6 b6 c6

a7 b7 c7

a8 b8 c8
a9 b9

la cual puede ser almacenada usando el algoritmo (vase [13]) Jagged Diago-
nal Storage (JDC), optimizado para ser usado en C++. Para este ejemplo en
particular, se har uso de una matriz de ndices

1 6 9
2 5 8

5 8 9

1 4 0

Ind =
3 6 9
(3.29)
1 2 3

7 8 9

4 7 8
7 8 0

y los datos sern almacenados usando la estructura



a1 b1 c1
a2 b2 c2

a3 b3 c3

a4 b4 0

Dat = a5 b5 c5 (3.30)
a6 b6 c6

a7 b7 c7

a8 b8 c8
a9 b9 0

antoniocarrillo@ciencias.unam.mx 44 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

de tal forma que la matriz A puede ser reconstruida de forma eficiente. Para
obtener el obtener el valor Ai,j , busco el valor j en la lista de ndices Ind dentro
del rengln i, si lo encuentro en la posicin k, entonces Ai,j = Datik , en otro
caso Ai,j = 0.

Casos Particulares de la Matriz Dispersa A Si la matriz A, que al ser


almacenada, se observa que existen a lo ms r diferentes renglones con valores
distintos de los n con que cuenta la matriz y si r << n, entonces es posible slo
guardar los r renglones distintos y llevar un arreglo que contenga la referencia
al rengln almacenado.

3.3.3 Multiplicacin Matriz-Vector


Los mtodos de descomposicin de dominio requieren por un lado la resolucin
de al menos un sistema lineal y por el otro lado requieren realizar la operacin
de multiplicacin de matriz por vector, i.e. Cu de la forma ms eficiente posible,
por ello los datos se almacenan de tal forma que la multiplicacin se realice en
la menor cantidad de operaciones.
Dado que la multiplicacin de una matriz C por un vector u, dejando el
resultado en v se realiza mediante el algoritmo:

for (i=0; i<ren; i++)


{
s = 0.0;
for (j=0; j < col; j++)
{
s += C[i][j]*u[j];
}
v[i] = s;
}

En el caso de matrices bandadas, se simplifica a:

for (i=0; i<ren; i++)


{
s= 0.0;
for (k=0; k < ban; k++)
{
if ((Ind[k] + i) >= 0 && (Ind[k]+i) < ren)
s += Dat[i][k]*u[Ind[k]+i];
}
v[i]=s;
}

De forma similar, en el caso de matrices dispersas, se simplifica a:

antoniocarrillo@ciencias.unam.mx 45 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

for (i=0; i<ren; i++)


{
s = 0.0, k = 0
while (Ind[i][k] != -1)
{
s += Dat[i][k]*u[Ind[i][k]];
k++;
if (k >= b) break;
}
v[i] = s;
}

De esta forma, al tomar en cuenta la operacin de multiplicacin de una


matriz por un vector, donde el rengln de la matriz involucrado en la multipli-
cacin queda generalmente en una regin contigua del Cache, se hace ptima la
operacin de multiplicacin de matriz por vector.

antoniocarrillo@ciencias.unam.mx 46 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

4 Implementacin Computacional del Mtodo


de Diferencias Finitas para la Resolucin de
Ecuaciones Diferenciales Parciales
Existen diferentes paquetes y lenguajes de programacin en los cuales se puede
implementar eficientemente la solucin numrica de ecuaciones diferenciales par-
ciales mediante el mtodo de diferencias Finitas, en este captulo se describe la
implementacin14 en los paquetes de cmputo SciLab y Octave (MatLab) y en
el lenguaje de programacin C++ y Python.

4.1 Implementacin en SciLab


Scilab15 es un paquete de cmputo open source para el clculo numrico el
cual provee un poderoso ambiente de clculo para aplicaciones Cientficas y de
Ingeniera.

Ejemplo 18 Sea

u (x) = 2 cos (x) , 0 x 0.5, u(0) = 1, u (0.5) =

entonces el programa queda implementado como:


function y=LadoDerecho(x)
y=-%pi*%pi*cos(%pi*x);
endfunction

function y=SolucionAnalitica(x)
y=cos(%pi*x);
endfunction

a=0; // Inicio dominio


c=0.5; // Fin dominio
M=40; // Particin
N=M-1; // Nodos interiores
h=(c-a)/(M-1); // Incremento en la malla
Y0=1; // Condicin Dirchlet inicial en el inicio del dominio
Y1=-%pi; // Condicin Neumann inicial en el fin del dominio
A=zeros(N,N); // Matriz A
b=zeros(N); // Vector b

R=1/(h^2);
P=-2/(h^2);
Q=1/(h^2);
1 4 En el caso de los ejemplos de MatLab, C++ y Python se usan matrices que minimizan la

memoria usada en el almacenamiento de las matrices y maximizan la eficiencia de los mtodos


numricos de solucin del sistema lineal asociado.
1 5 Scilab [http://www.scilab.org]

antoniocarrillo@ciencias.unam.mx 47 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

// Primer renglon de la matriz A y vector b


A(1,1)=P;
A(1,2)=Q;
b(1)=LadoDerecho(a)-Y0*R; // Frontera Dirichlet
// Renglones intermedios de la matriz A y vector b
for i=2:N-1
A(i,i-1)=R;
A(i,i)=P;
A(i,i+1)=Q;
b(i)=LadoDerecho(a+h*(i-1));
end
// Relglon final de la matriz A y vector b
A(N,N-1)=-1/(h^2);
A(N,N)=-1/(h^2);
b(N)=Y1/h; // Frontera Neumann

// Resuleve el sistema lineal Ax=b


x=inv(A)*b;

// Prepara la graficacin
xx=zeros(M,1);
zz=zeros(M,1);
for i=1:M
xx(i)=a+h*(i-1);
zz(i)=SolucionAnalitica(xx(i));
end
yy=zeros(M,1);
yy(1)=Y0; // Condicin inicial
for i=1:N
yy(i+1)=x(i);
end
// Grafica la solucin de la Ecuacin Diferencial Parcial en 1D
plot2d(xx,[yy,zz])

antoniocarrillo@ciencias.unam.mx 48 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

4.2 Implementacin en Octave (MatLab)


GNU Octave16 es un paquete de cmputo open source para el clculo numrico
muy parecido a MatLab17 pero sin costo alguno para el usuario el cual
provee un poderoso ambiente de clculo para aplicaciones Cientficas y de Inge-
niera.

Ejemplo 19 Sea

u (x) = 2 cos(x), 0 x 1, u(0) = 1, u(1) = 1

entonces el programa queda implementado como:


% Mtodo de diferencias Finitas una Dimensin
function [x,U] = fdm1d(a,b,ua,ub,n)
h = (b-a)/n;
h1= h*h;
A = sparse(n-1,n-1)
F= zeros(n-1,1)
for i=1:n-2,
A(i,i) = -2/h1;
A(i+1,i) = 1/h1;
A(i,i+1) = 1/h1;
end
A(n-1,n-1) = -2/h1;
for i=1:n-1,
x(i) = a + i*h;
F(i) = f(x(i));
end
F(1) = F(1) - ua/h1;
F(n-1) = F(n-1) - ub/h1;

% Soluciona el sistema
U = A\F;

% Graficar la solucin numrica


plot(x,U,o); hold
% Graficar la solucin anlitica
u = zeros(n-1,1);
for i=1: n-1,
u(i) = cos(pi*x(i));
end
plot(x,u)

% Grafica el error
figure(2);
1 6 GNU Octave [http://www.gnu.org/software/octave/]
1 7 MatLab [http://www.mathworks.com/products/matlab/]

antoniocarrillo@ciencias.unam.mx 49 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

plot(x,U-u);
return

% Lado derecho
function y = f(x)
y = -pi*pi*cos(pi*x);
return

Para hacer uso del programa, escribir en la consola

[x,U] = fdm1d(0,1,1,-1,40);

antoniocarrillo@ciencias.unam.mx 50 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

4.3 Implementacin en C++


GMM++18 es una librera para C++ que permite definir diversos tipos de
matrices y vectores adems operaciones bsicas de algebra lineal. La facilidad
de uso y la gran cantidad de opciones hacen que GMM++ sea una buena opcin
para trabajar con operaciones elementales de algebra lineal.
Se instala en Debian Linux y/o Ubuntu como:
# apt-get install libgmm++-dev
Para compilar el ejemplo usar:
$ g++ ejemplito.cpp
Para ejecutar usar:
$ ./a.out

Ejemplo 20 Sea

u (x) + u(x) = 0, 0 x 1, u(0) = 0, u(1) = 1

entonces el programa queda implementado como:


#include <gmm/gmm.h>
int main(void)
{
int i;
double a=0; // Inicio dominio
double c=1; // Fin dominio
int M=20; // Particin
int N=M-2; // Nodos interiores
double h=(c-a)/(M-1); // Incremento en la malla
double Y0=0.0; // Condicion inicial en el inicio del dominio
double Y1=1.0; // Condicion inicial en el fin del dominio

// Matriz densa
gmm::dense_matrix<double> AA(N, N);

// Matriz dispersa
gmm::row_matrix< gmm::rsvector<double> > A(N, N);

// Vectores
std::vector<double> x(N), b(N);

double P=2/(h*h);
double Q=-1/(h*h)+1/(2*h);
double R=-1/(h*h)-1/(2*h);
// Primer renglon de la matriz A y vector b
A(0,0)=P;
A(0,1)=Q;
1 8 GMM++ [http://download.gna.org/getfem/html/homepage/gmm/]

antoniocarrillo@ciencias.unam.mx 51 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

b[0]=-Y0*R;
// Renglones intermedios de la matriz A y vector b
for(i=1;i <N-1;i++)
{
A(i,i-1)=R;
A(i,i)=P;
A(i,i+1)=Q;
}
// Relglon final de la matriz A y vector b
A(N-1,N-2)=R;
A(N-1,N-1)=P;
b[N-1]=-Y1*Q;

gmm::copy(A,AA);
// LU para matrices densa
gmm::lu_solve(AA, x, b);
std::cout << "LU"<< x << gmm::endl;

gmm::identity_matrix PS; // Optional scalar product for cg


gmm::identity_matrix PR; // Optional preconditioner
gmm::iteration iter(10E-6);// Iteration object with the max residu
size_t restart = 50; // restart parameter for GMRES
gmm::cg(A, x, b, PS, PR, iter); // Conjugate gradient

std::cout << "CGM"<< x << std::endl;


gmm::bicgstab(A, x, b, PR, iter); // BICGSTAB BiConjugate Gradient Sta-
bilized

std::cout << "BICGSTAB"<< x << std::endl;


gmm::gmres(A, x, b, PR, restart, iter); // GMRES generalized minimum
residual

std::cout << "GMRES"<< x << std::endl;


gmm::qmr(A, x, b, PR, iter); // Quasi-Minimal Residual method.
std::cout << "Quasi-Minimal"<< x << std::endl;

// computation of a preconditioner (ILUT)


gmm::ilut_precond< gmm::row_matrix< gmm::rsvector<double> > > Pre(A,
10, 1e-4);
gmm::gmres(A, x, b, Pre, restart, iter); // execute the GMRES algorithm
std::cout << "GMRES preconditiones ILUT"<< x << std::endl;
return 0;
}

antoniocarrillo@ciencias.unam.mx 52 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

4.4 Implementacin en Python


Python es un lenguaje de programacin interpretado multiparadigma cuya filosofa
hace hincapie en una sintaxis que favoresca un cdigo legible, que corre en mul-
tiplataforma y posee una licencia de cdigo abierto, el cual provee un poderoso
ambiente de clculo para aplicaciones Cientficas y de Ingeniera.

Ejemplo 21 Sea
ut + au(x) = 0, 2 x 8
mediante el esquema Upwind, entonces el programa queda implementado como:
# -*- coding: utf-8 -*-
"""
@author: omar jonathan mendoza bernal
Upwind scheme for
u_t + a(x) u_x = 0
Ejemplo
u_t + a u_x = 0
Si u(x,0) = f(x) es la condicin inicial
la solucin analitica es
u(x,t) = f(x-at)
"""
from math import exp
from scipy import sparse
import numpy as np
import matplotlib.pyplot as plt
# Ecuacin
# u_t + 2 u_x = 0
coef_a = 2
def condicion_inicial (x):
"""
Condicin inicial de la ecuacin
"""
y = exp (-(x - 0.2)*(x - 0.02))
return y
def sol_analitica (x, t):
"""
Solucin analtica de la ecuacin
"""
y = exp(-(x-2*t)*(x-2*t))
return y
############
# Dominio
############
a = -2.0
b = 8.0
# Particin del dominio

antoniocarrillo@ciencias.unam.mx 53 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

nNodos = 401
h = (b - a)/(nNodos - 1)
# Intervalo de tiempo
dt = 0.012
# creo el vector w donde se guradar la solucin para cada tiempo
# B matriz del lado derecho
w = np.zeros((nNodos,1))
B = np.zeros((nNodos, nNodos))
B = np.matrix(B)
espacio = np.zeros((nNodos,1))
for i in xrange(nNodos):
xx_ = a + i*h
espacio[i] = xx_
w[i] = condicion_inicial(xx_)
print "Espacio"
print espacio
print "Condicin Inicial"
print w
mu = coef_a * dt / h
if mu <= 1:
print "mu ", mu
print "Buena aproximacin"
else:
print "mu ", mu
print "Mala aproximacin"
if coef_a >= 0:
B[0,0] = 1 - mu
for i in xrange (1, nNodos):
B[i,i-1] = mu
B[i,i] = 1 - mu
else:
B[0,0] = 1 + mu;
B[0,1] = -mu;
# se completa las matrices desde el renglon 2 hasta el m-2
for i in xrange(1, nNodos-1):
B[i,i] = 1 + mu;
B[i, i+1] = -mu;
B[nNodos-1,nNodos-1] = 1 + mu
# para guardar la soulcin analitica
xx = np.zeros((nNodos,1));
iteraciones = 201
# Matriz sparse csr
Bs = sparse.csr_matrix(B);
# Resolvemos el sistema iterativamente
for j in xrange (1, iteraciones):
t = j*dt;

antoniocarrillo@ciencias.unam.mx 54 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

w = Bs*w;
# Imprimir cada 20 iteraciones
if j%20 == 0:
print "t", t
print "w", w
plt.plot(espacio, w)

antoniocarrillo@ciencias.unam.mx 55 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

5 Bibliografa
Referencias
[1] K. Hutter y K Jhnk, Continuum Methods of Physical Modeling, Springer-
Verlag Berlin Heidelberg New York, 2004.
[2] J. L. Lions y E. Magenes, Non-Homogeneous Bounduary Value Problems
and Applicarions Vol. I, Springer-Verlag Berlin Heidelberg New York, 1972.
[3] A. Quarteroni y A. Valli, Domain Decomposition Methods for Partial Dif-
ferential Equations. Clarendon Press Oxford, 1999.
[4] A. Quarteroni y A. Valli; Numerical Approximation of Partial Diferential
Equations. Springer, 1994.
[5] B. Dietrich, Finite Elements: Theory, Fast Solvers, and Applications in
Solid Mechanics, Cambridge University, 2001.
[6] B. F. Smith, P. E. Bjrstad, W. D. Gropp; Domain Decomposition, Parallel
Multilevel Methods for Elliptic Partial Differential Equations. Cambridge
University Press, 1996.
[7] Fuzhen Zhang, The Schur Complement and its Aplications, Springer, Nu-
merical Methods and Algorithms, Vol. 4, 2005.
[8] B. I. Wohlmuth; Discretization Methods and Iterative Solvers Based on
Domain Decomposition. Springer, 2003.
[9] L. F. Pavarino, A. Toselli; Recent Developments in Domain Decomposition
Methods. Springer, 2003.
[10] M.B. Allen III, I. Herrera & G. F. Pinder; Numerical Modeling in Science
And Engineering. John Wiley & Sons, Inc . 1988.
[11] R. L. Burden y J. D. Faires; Anlisis Numrico. Math Learning, 7 ed. 2004.
[12] S. Friedberg, A. Insel, and L. Spence; Linear Algebra, 4th Edition, Prentice
Hall, Inc. 2003.
[13] Y. Saad; Iterative Methods for Sparse Linear Systems. SIAM, 2 ed. 2000.
[14] Y. Skiba; Mtodos y Esquemas Numricos, un Anlisis Computacional.
UNAM, 2005.
[15] W. Gropp, E. Lusk, A. Skjellem, Using MPI, Portable Parallel Program-
ming Whit the Message Passing Interface. Scientific and Engineering Com-
putation Series, 2ed, 1999.
[16] I. Foster; Designing and Building Parallel Programs. Addison-Wesley Inc.,
Argonne National Laboratory, and the NSF, 2004.

antoniocarrillo@ciencias.unam.mx 56 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

[17] Jorge L. Ortega-Arjona, Patterns for Parallel Software Design, Wiley series
in Software Design Patterns, 2010.
[18] DDM Organization, Proceedings of International Conferences on Domain
Decomposition Methods, 1988-2012.
http://www.ddm.org and http://www.domain-decomposition.com
[19] Toselli, A., and Widlund O. Domain decomposition methods- Algorithms
and theory, Springer Series in Computational Mathematics, Springer-
Verlag, Berlin, 2005, 450p.
[20] Farhat, C. and Roux, F. X. A Method of Finite Element Tearing and In-
terconnecting and its Parallel Solution Algorithm. Int. J. Numer. Meth.
Engng., 32:1205-1227, 1991.
[21] Mandel J. & Tezaur R. Convergence of a Substructuring Method with La-
grange Multipliers, Numer. Math. 73 (1996) 473-487.
[22] Farhat C., Lesoinne M. Le Tallec P., Pierson K. & Rixen D. FETI-DP a
Dual-Primal Unified FETI method, Part 1: A Faster Alternative to the
two-level FETI Method, Int. J. Numer. Methods Engrg. 50 (2001) 1523-
1544.
[23] Farhat C., Lesoinne M., Pierson K. A Scalable Dual-Primal Domain De-
composition Method, Numer. Linear Algebra Appl. 7 (2000) 687-714.
[24] Mandel J. & Tezaur R. On the Convergence of a Dual-Primal Substructu-
ring Method, Numer. Math. 88(2001), pp. 5443-558.
[25] Mandel, J. Balancing Domain Decomposition. Comm. Numer. Meth. En-
grg., 9:233-241, 1993.
[26] Mandel J., & Brezina M., Balancing Domain Decomposition for Problems
with Large Jumps in Coefficients, Math. Comput. 65 (1996) 1387-1401.
[27] Dohrmann C., A Preconditioner for Substructuring Based on Constrained
Energy Minimization. SIAM J. Sci. Comput. 25 (2003) 246-258.
[28] Mandel J. & Dohrmann C., Convergence of a Balancing Domain Decom-
position by Constraints and Energy Minimization. Numer. Linear Algebra
Appl. 10 (2003) 639-659.
[29] Da Conceio, D. T. Jr., Balancing Domain Decomposition Preconditio-
ners for Non-symetric Problems, Instituto Nacional de Matemtica pura e
Aplicada, Agencia Nacional do Petrleo PRH-32, Rio de Janeiro, May. 9,
2006.
[30] J. Li and O. Widlund, FETI-DP, BDDC and block Cholesky Methods, Int.
J. Numer. Methods Engrg. 66, 250-271, 2005.

antoniocarrillo@ciencias.unam.mx 57 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

[31] Farhat Ch., Lesoinne M., Le Tallec P., Pierson K. and Rixen D. FETI-DP:
A Dual-Primal Unified FETI Method-Part I: A Faster Alternative to the
Two Level FETI Method. Internal. J. Numer. Methods Engrg., 50:1523-
1544, 2001.
[32] Rixen, D. and Farhat Ch. A Simple and Efficient Extension of a Class of
Substructure Based Preconditioners to Heterogeneous Structural Mechanics
Problems. Internal. J. Numer. Methods Engrg., 44:489-516, 1999.
[33] J. Mandel, C. R. Dohrmann, and R. Tezaur, An Algebraic Theory for Pri-
mal and Dual Substructuring Methods by Constraints, Appl. Numer. Math.,
54 (2005), pp. 167-193.
[34] A. Klawonn, O. B. Widlund, and M. Dryja, Dual-primal FETI Methods
for Three-Dimensional Elliptic Problems with Heterogeneous Coefficients,
SIAM J. Numer. Anal., 40 (2002), pp. 159-179.
[35] Alberto Rosas Medina, Mtodos de Estabilizacin para Problemas de
Adveccin-Difusin, Trabajo de Investigacin para Sustentar el Examen
de Candidaura al Doctorado, Postgrado en Ciencias de la Tierra, UNAM,
2011.
[36] Klawonn A. and Widlund O.B., FETI and Neumann-Neumann Iterative
Substructuring Methods: Connections and New Results. Comm. Pure and
Appl. Math. 54(1): 57-90, 2001.
[37] Tezaur R., Analysis of Lagrange Multipliers Based Domain Decomposition.
P.H. D. Thesis, University of Colorado, Denver, 1998.
[38] Herrera I. & Rubio E., Unified Theory of Differential Operators Acting
on Discontinuos Functions and of Matrices Acting on Discontinuous Vec-
tors, 19th International Conference on Domain Decomposition Methods,
Zhangjiajie, China 2009. (Oral presentation). Internal report #5, GMMC-
UNAM, 2011.
[39] Valeri I. Agoshkov, Poincar-Steklov Operators and Domain Decomposition
Methods in Finite Dimensional Spaces. First International Symposium on
Domain Decomposition Methods for Partial Differential Equations, pages
73-112, Philadelphia, PA, 1988. SIAM. Paris, France, Junuary 7-9, 1987.
[40] Toselli, A., FETI Domain Decomposition Methods for Escalar Advection-
Diffusion Problems. Compututational Methods Appl. Mech. Engrg. 190.
(2001), 5759-5776.
[41] C.T. Keller, Iterative Methods for Linear and Nonlinear Equations, Societe
for Industrial and Applied Mathematics, 1995.
[42] Manoj Bhardwaj, David Day, Charbel Farhat, Michel Lesoinne, Kendall
Pierson, and Daniel Rixen. Application of the PETI Method to ASCI Pro-
blems: Scalability Results on One Thousand Processors and Discussion

antoniocarrillo@ciencias.unam.mx 58 Antonio Carrillo Ledesma


Introduccin al Mtodo de Diferencias Finitas y su Implementacin
Computacional

of Highly Heterogeneous Problems. Intemat. J. Numer. Methods Engrg.,


47:513-535, 2000.
[43] Zdengk Dostdl and David Hordk. Scalability and FETI Based Algorithm
for Large Discretized Variational Inequalities. Math. Comput. Simulation,
61(3-6): 347-357, 2003. MODELLING 2001 (Pilsen).
[44] Charbel Farhat, Michel Lesoinne, and Kendall Pierson. A Scalable Dual-
Primal Domain Decomposition Method. Numer. Linear Algebra Appl., 7(7-
8):687-714, 2000.
[45] Yannis Fragakis and Manolis Papadrakakis, The Mosaic of High Perfor-
mance Domain Decomposition Methods for Structural Mechanics: Formu-
lation, Interrelation and Numerical Efficiency of Primal and Dual Methods.
Comput. Methods Appl. Mech. Engrg, 192(35-36):3799-3830, 2003.
[46] Kendall H. Pierson, A family of Domain Decomposition Methods for the
Massively Parallel Solution of Computational Mechanics Problems. PhD
thesis, University of Colorado at Boulder, Aerospace Engineering, 2000.
[47] Manoj Bhardwaj, Kendall H. Pierson, Garth Reese, Tim Walsh, David Day,
Ken Alvin, James Peery, Charbel Farhat, and Michel Lesoinne. Salinas, A
Scalable Software for High Performance Structural and Mechanics Simula-
tion. In ACM/IEEE Proceedings of SC02: High Performance Networking
and Computing. Gordon Bell Award, pages 1-19, 2002.
[48] Klawonn, A.; Rheinbach, O., Highly Scalable Parallel Domain Decompo-
sition Methods with an Application to Biomechanics, Journal of Applied
Mathematics and Mechanics 90 (1): 5-32, doi:10.1002/zamm.200900329.
[49] Petter E. Bjrstad and Morten Skogen. Domain Decomposition Algorithms
of Schwarz Type, Designed for Massively Parallel Computers. In David E.
Keyes, Tony F. Chan, Gerard A. Meurant, Jeffrey S. Scroggs, and Robert G.
Voigt, editors. Fifth International Symposium on Domain Decomposition
Methods for Partial Differential Equations, pages 362-375, Philadelphia,
PA, 1992. SIAM. Norfolk, Virgina, May 6-8, 1991.
[50] Yau Shu Wong and Guangrui Li. Exact Finite Difference Schemes for Sol-
ving Helmholtz Equation at any Wavenumber. International Journal of Nu-
merical Analysis and Modeling, Series B, Volume 2, Number 1, Pages 91-
108, 2011.
[51] Zhangxin Chen, Guanren Huan and Yuanle Ma. Computational Methods
for Multiphase Flow in Porous Media, SIAM, 2006.

antoniocarrillo@ciencias.unam.mx 59 Antonio Carrillo Ledesma

Potrebbero piacerti anche