You are on page 1of 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
1.1 Aproximacin de la Primera Derivada
1.1.1 Diferencias Progresivas . . . . .
1.1.2 Diferencias Regresivas . . . . .
1.1.3 Diferencias Centradas . . . . .
1.2 Derivadas de Ordenes Mayores . . . .
1.2.1 Derivada de Orden Dos . . . .
1.2.2 Derivadas de Ordenes Mayores
1.3 Derivadas en Dos Dimensiones . . . .
1.4 Derivadas en Tres Dimensiones . . . .

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

2
2
2
3
3
4
5
5
6
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 Solucin de Grandes Sistemas de Ecuaciones Lineales
3.1 Mtodos Directos . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Factorizacin LU . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Factorizacin Cholesky . . . . . . . . . . . . . . . . . . . .
3.1.3 Factorizacin LU para Matrices Tridiagonales . . . . . . .
3.2 Mtodos Iterativos . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Mtodo de Gradiente Conjugado . . . . . . . . . . . . . .
3.2.2 Mtodo Residual Mnimo Generalizado . . . . . . . . . . .
3.3 Estructura ptima de las Matrices en su Implementacin Computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.1 Matrices Bandadas . . . . . . . . . . . . . . . . . . . . . .
3.3.2 Matrices Dispersas . . . . . . . . . . . . . . . . . . . . . .
3.3.3 Multiplicacin Matriz-Vector . . . . . . . . . . . . . . . .

33
33
33
35
35
36
38
40
41
43
44
45

4 Implementacin Computacional del Mtodo de Diferencias Finitas 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

antoniocarrillo@ciencias.unam.mx

56

Antonio Carrillo Ledesma

Introduccin al Mtodo de Diferencias Finitas y su Implementacin


Computacional

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 computacional.
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
+
dx xi
2! dx2 p

(1.2)

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)
dx xi
x

como

f (xi ) =

fi+1 fi
x

(1.5)

(1.6)

para simplificar notacin.

antoniocarrillo@ciencias.unam.mx

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
+
dx xi
2! dx2 r

(1.7)

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 
.
(1.9)
Or (x) =
2! dx2 
r

Es comn escribir la anterior expresin como



df 
f (xi ) f(xi x)
=
+ Or (x)
dx xi
x

como

f (xi ) =

fi fi1
x

(1.10)

(1.11)

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

f(xi x) = f(xi ) x




df 
x2 d2 f 
x3 d3 f 
+

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
+
+
dx xi
3!
dx3 p
dx3 r

(1.13)

(1.14)

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
2x
xi

antoniocarrillo@ciencias.unam.mx

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).

x0

x0

Es comn encontrar expresada la derivada1



f (xi + x) f (xi x)
df 
=
dx xi
2x

como

f (xi ) =

fi+1 fi1
2x

(1.17)

(1.18)

(1.19)

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 ejemplos son
f (xi ) =
f (xi ) =
f (xi ) =
f (xi ) =
f (xi ) =

1.2

3fi + 4fi+1 fi+2


+ O(x2 )
(1.20)
2x
3fi 4fi1 + fi2
+ O(x2 )
2x
2fi+1 + 3fi 6fi1 + fi2
+ O(x3 )
6x
fi2 8fi1 + 8fi+1 fi+2
+ O(x4 )
12x
25fi + 48fi+1 36fi+2 + 16fi+3 3fi+4
+ O(x4 )
12x

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
f (xi +xi )f (xi xi+ )
df 
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

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


f (xi +x) = f(xi )+xf (xi )+

x2
x3
x4 (4)
f (xi )+
f (xi )+
f ( p ) (1.21)
2!
3!
4!

y
f (xi x) = f(xi )xf (xi )+

x2
x3
x4 (4)
f (xi )
f (xi )+
f ( r ) (1.22)
2!
3!
4!

y eliminado las derivadas primeras, sumando las ecuaciones anteriores y despejando se encuentra que
f (xi ) =

f(xi x) 2f(xi ) + f(xi + x) x2 (4)

f ( c )
x2
12

(1.23)

as, la aproximacin a la segunda derivada usando diferencias centradas con un


error de truncamiento Oc (x2 ) es
f (xi ) =

f(xi x) 2f (xi ) + f(xi + x)


x2

(1.24)

Es comn escribir la anterior expresin como


f (xi ) =

fi1 2fi + fi+1


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
f (xi ) =
f (xi ) =
f (xi ) =
1.2.2

fi+2 2fi+1 + fi
+ O(x)
x2
fi+3 + 4fi+2 5fi+1 + 2fi
+ O(x2 )
x2
fi+2 + 16fi+1 30fi + 16fi1 fi2
+ O(x4 )
12x2

(1.25)

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
f (xi ) =
f (xi ) =
f (xi ) =

fi+3 3fi+2 + 3fi+1 fi


+ O(x)
(1.26)
x3
fi+2 2fi+1 + 2fi1 fi2
+ O(x2 )
2x3
fi3 8fi2 + 13fi1 13fi+1 + 8fi+2 fi+3
+ O(x4 )
8x3

antoniocarrillo@ciencias.unam.mx

Antonio Carrillo Ledesma

Introduccin al Mtodo de Diferencias Finitas y su Implementacin


Computacional

Algunos ejemplos para derivadas cuartas son


f (xi ) =
f (xi ) =
f (xi ) =

1.3

fi+4 4fi+3 + 6fi+2 4fi+1 + fi


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

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 )
+
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

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

As, la aproximacin en diferencias hacia delante de f /x y f /y es


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

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

(1.29)

o en su forma simplificada (para simplificar la notacin, asociamos x = h y


y = k), tenemos
f (xi , yj )
x
f (xi , yj )
y

fi+1,j fi,j
h
fi,j+1 fi,j
.
k

(1.30)

La aproximacin en diferencias hacia atrs de f /x y f /y es


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

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

(1.31)

o en su forma simplificada, tenemos


f (xi , yj )
x
f (xi , yj )
y
antoniocarrillo@ciencias.unam.mx

fi,j fi1,j
h
fi,j fi,j1
.
k

(1.32)

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 )
x
f (xi , yj )
y

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

(1.33)

o en su forma simplificada, tenemos


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

fi+1,j fi1,j
2h
fi,j+1 fi,j1
.
2k

(1.34)

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


es
2 f (xi , yj )
x2
2
f (xi , yj )
y2

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


(1.35)
x2
f (xi , yj + y) f (xi , yj ) + f (xi , yj y)
y2

o en su forma simplificada, tenemos


2 f (xi , yj )
x2
2
f (xi , yj )
y 2

1.4

fi+1,j 2fi,j + fi1,j


h2
fi,j+1 2fi,j + fi,j1
.
k2

(1.36)

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 )
+
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

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

As, la aproximacin en diferencias hacia delante de f /x, f /y y f /z

antoniocarrillo@ciencias.unam.mx

Antonio Carrillo Ledesma

Introduccin al Mtodo de Diferencias Finitas y su Implementacin


Computacional

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

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

(1.38)

o en su forma simplificada (para simplificar la notacin, asociamos x = h, y =


l y z = m), tenemos
f (xi , yj , zk )
x
f (xi , yj , zk )
y
f (xi , yj , zk )
z

fi+1,j,k fi,j,k
h
fi,j+1,k fi,j,k
l
fi,j,k+1 fi,j,k
.
m

(1.39)

La aproximacin en diferencias hacia atrs de f /x, f /y y f /z es


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

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

(1.40)

o en su forma simplificada, tenemos


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

fi,j,k fi1,j,k
h
fi,j,k fi,j1,k
l
fi,j,k fi,j,k1
.
m

(1.41)

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


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

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

antoniocarrillo@ciencias.unam.mx

(1.42)

Antonio Carrillo Ledesma

Introduccin al Mtodo de Diferencias Finitas y su Implementacin


Computacional

o en su forma simplificada, tenemos


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

fi+1,j,k fi1,j,k
2h
fi,j+1,k fi,j1,k
2l
fi,j,k+1 fi,j,k1
.
2m

(1.43)

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 )
x2
2 f (xi , yj , zk )
y 2
2
f (xi , yj , zk )
z 2

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


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

o en su forma simplificada, tenemos


2 f (xi , yj , zk )
x2
2
f (xi , yj , zk )
y2
2 f (xi , yj , zk )
z 2

antoniocarrillo@ciencias.unam.mx

fi+1,j,k 2fi,j,k + fi1,j,k


h2
fi,j+1,k 2fi,j,k + fi,j1,k
l2
fi,j,k+1 2fi,j,k + fi,j,k1
.
m2

(1.45)

Antonio Carrillo Ledesma

Introduccin al Mtodo de Diferencias Finitas y su Implementacin


Computacional

Mtodo de Diferencias Finitas en Una Dimensin

Consideremos la ecuacin diferencial parcial

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

(2.1)

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

en a x b

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 diferencias 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 solucin 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
xi = ih,

i = 0, 1, ..., n,

h=

1
= x
n

(2.3)

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 )

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


h2

(2.4)

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

derecha), i.e. u (xi )

u(xi hi )2u(x)+u(xi +hi+ )


.
(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
u (xi )

ui1 2ui + ui+1


h2

(2.5)

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


del siguiente sistema lineal de ecuaciones
u 2u1 + u2
h2
u1 2u2 + u3
h2
ui1 2ui + ui+1
h2
un3 2un2 + un1
h2
un2 2un1 + u
h2

= f (x1 )
= f (x2 )
..
.
(2.6)

= f (xi )
..
.
= f (xn2 )
= f (xn1 ).

Este sistema de ecuaciones se puede escribir como un matriz A y los vectores u y fde la forma

h22
1

h2

1
h2

h22
1

h2

1
h2

h22
..

1
h2

..

1
h2

..

.
h22
1

h2

1
h2

h22

u1
u2
u3
..
.

un2
un1

f(x1 ) uh2
f (x2 )
f (x3 )
..
.
f (xn2 )
u
f(xn1 ) h2

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

2 1
1 2 1

1 2
1

..
h2
.

1
..
.
1

u1
u2
u3
..
.

..

2 1 un2
1 2
un1

f(x1 ) uh2
f (x2 )
f (x3 )
..
.
f(xn2 )
u
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 solucin 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)


en a x b

(2.7)

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
pi

ui1 2ui + ui+1


ui+1 ui1
ri ui = fi
+ qi
2
h
2h

i = 1, 2, ..., n. (2.8)

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 segundo 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
i1
p(ui+1 , t) ui+1h+ui p (ui1,t ) ui u
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 centradas para el trmino de difusin y el esquema upwind para el trmino
de adveccin
pi

ui1 2ui + ui+1


ui+1 ui1
+ qi
ri ui
2
h
h

= fi , si qi 0

ui1 2ui + ui+1


ui ui1
+ qi
ri ui
h2
h

= fi , si qi < 0

pi

(2.11)

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 aproximacin 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 regresivas Ec.(1.10)

u(xi ) u(xi h)
du 
=

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
2h

(2.15)

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 .
2h

(2.16)

Estos valores no tienen significado fsico alguno, dado que esos puntos se encuentran 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


xi = ih,

i = 0, 1, ..., n,

h=

1
= x.
n

(2.17)

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 )

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


h2

(2.18)

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


del siguiente sistema lineal de ecuaciones
u1 u1
2h
u0 2u1 + u2
h2
ui1 2ui + ui+1
h2
un2 2un1 + un
h2
un+1 un1
2h

= cte1
= f (x1 )
..
.
= f (xi )

(2.19)

..
.
= f (xn1 )
= cte2 .

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
u1 = u1 +

antoniocarrillo@ciencias.unam.mx

2
2h
un

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
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),

(2.20)

0x1

con condiciones de frontera Dirichlet y Neumman


y

u(0) = u

du
= cte1 en u(1).
dx

respectivamente. Para usar el procedimiento general de solucin numrica mediante 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 .
2h

(2.21)

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
xi = ih,

i = 0, 1, ..., n,

h=

1
= x.
n

(2.22)

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 )

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


h2

antoniocarrillo@ciencias.unam.mx

18

(2.23)

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
h2
u1 2u2 + u3
h2
ui1 2ui + ui+1
h2
un2 2un1 + un
h2
un+1 un1
2h

= f (x1 )
= f (x2 )
..
.
(2.24)

= f (xi )
..
.
= f (xn1 )
= cte1 .

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 espaciales, 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

donde

ut = Lu

(2.25)

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

(2.26)

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

(2.27)

aqu, los coeficientes p, q y r pueden depender del espacio y del tiempo. Entonces
el esquema theta est dado por

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 x
2 .
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:
ut

uj+1
uji
i
t

(2.28)

 j

j
j
j+1
j+1
j+1
u

2u
+
u

2u
+
u
u
p
i1
i
i+1
i1
i
i+1
(p (x) u (x))
+
2
x2
x2
 j

j
j+1
j+1
q ui1 + ui+1 ui1 + ui+1

q (x) u (x)
+
2
2x
2x

(2.29)
(2.30)

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 contengan 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 desarrollados 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
i
i
t2
 j

ui1 2uji + uji+1

(p (x) u (x)) p
x2

 j
ui1 + uji+1

q (x) u (x) q
2x
utt

(2.32)
(2.33)
(2.34)

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
= 2uji uj1
+ (t)2 Buj
i
i

(2.35)

uj+1
= 2uji uj1
+ (t)2 Luj
i
i

(2.36)

2
0
u1i = 2u0i u1
i + (t) Lu

(2.37)

esto se logra, colocando del lado izquierdo la igualdad de los trminos que contengan 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
es necesario conocer
i
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
para j = 0, entonces

u1i u1
i

de donde tenemos u0i es la condicin inicial y 2t es la primer derivada de


la condicin inicial, as tenemos que para el primer tiempo tenemos
u1i = u(xi , 0) + tu (xi , 0) + (t)2 Lu0

lo cual permite calcular

u1i

(2.38)

a partir de las condiciones iniciales.

La derivacin del mtodo parte de


utt
uj1
i

2uji

+ uj+1
i
2

(t)

uj+1
i

= Luj

(2.39)

= Luj
= 2uji uj1
+ (t)2 Luj
i

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 utilizar 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 |
La norma-1, definida como E1 =
La norma-2, definida como E2 =
antoniocarrillo@ciencias.unam.mx

30

n

i=1

|ei |

 n

i=1

e2i

 12
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
(2.40)

lim E = 0.

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
Lh u(x) =

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


.
h2

(2.41)

Definicin 9 El error de truncamiento local es definido como


(2.42)

T (x) = Lu Lh u.

Para la ecuacin diferencial u (x) = f(x) y el esquema de diferencias centradas usando tres puntos u(xh)2u(x)+u(x+h)
, el error de truncamiento local
h2
es
u(x h) 2u(x) + u(x + h)
h2
u(x h) 2u(x) + u(x + h)
= f (x)
.
h2

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

(2.43)

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.

h0

h0

(2.44)

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

T (x) = u (x)

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


h2 (4)
=

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 consistente y la discretizacin es de segundo orden de precisin.
La consistencia no puede garantizar un esquema de diferencias finitas trabaje. 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. 
 

 T  . Para
Si la matriz A es no singular, entonces E = A1 T  A1
 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, entonces es convergente.

antoniocarrillo@ciencias.unam.mx

32

Antonio Carrillo Ledesma

Introduccin al Mtodo de Diferencias Finitas y su Implementacin


Computacional

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 particular una gran cantidad de sistemas continuos geofsicos requieren el procesamiento de sistemas algebraicos de gran escala. En este trabajo se muestra
como proceder, para transformar un problema de ecuaciones diferenciales parciales 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 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], [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 Factorizacin 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 bandadas y dispersar son PETCs, HYPRE, ATLAS, LAPACK++, LAPACK, EISPACK, LINPACK, 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 {
Ajk = Ajk Aji Aik
}
}
}

(3.2)

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
y Uu = y.

Ly = f

(3.3)

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


que
Ly

= f

y = fi

y
Uu = y

u =

1
Aii

yi

i1

j=1

n


y1 =
f1 /A11

(3.4)

xn = y
n /Ann

.(3.5)

Aij yj para toda i = 2, ..., n

j=i+1

Aij xj para toda i = n 1, ..., 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


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.
n3 /3 + n2

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


Aji = Aji
Ajk Aik /Aii

(3.6)

k=1

}
Ann



n1


= 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 triangulares
Ly = f y LT u = y
(3.7)
usando la formulacin equivalente dada por las Ec.(3.4) y (3.5) para la descomposicin LU.
La descomposicin LDLT requiere de n3 /6+n2 7n/6 multiplicaciones/divisiones 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
}
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

(3.8)

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


multiplicaciones/divisiones y (3n 3) sumas/restas, en contraste con la descomposicin 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
(3.9)

Au = f

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 solucin 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 inicial 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
cond(A) =

max
1
min

(3.11)

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 Conjugado slo 3 iteraciones.
Los mtodos basados en el espacio de Krylov, minimizan en la k-sima iteracin 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 .

antoniocarrillo@ciencias.unam.mx

37

(3.13)
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 Gradiente Conjugado Conjugate Gradient Method (CGM). La idea bsica en
que descansa el mtodo del Gradiente Conjugado
en construir una base
! consiste
"
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 construccin de una base ortogonal utilizando el procedimiento de Gramm-Schmidt requiere, al seleccionar cada nuevo elemento de la base, asegurar su ortogonalidad
con respecto a cada uno de los vectores construidos previamente. La gran ventaja 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 condicin 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 
pn ,Apn 
n+1
= un + n pn
u
n+1
r
= rn n Apn
Prueba de convergencia
rn+1 ,rn+1 
n = rn ,rn 
pn+1 = rn+1 + n pn
n=n+1
n =

(3.14)

donde ,  = (, ) ser el producto interior adecuado al sistema lineal en particular, 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) = max
1, entonces el mtodo de Gradiente
min
Conjugado satisface la Anorma del error dado por

n
en 
2
1



2
(3.16)
&
'n &
'n
e0 
+1
+1
+1
+
1
1
donde em = u um del sistema Au = b.

Ntese que para grande se tiene que

1
2

1
+1

tal que

(3.17)



 
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 llamado 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 convergencia 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 satisfaciendo 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
en
j=1
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
(3.21)


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

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


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



hn+1,n = wn+1
n+1
n+1
n+1
v
= wn+1 /hn+1,n



yn
Calcular y n tal que n =  0 e1 H
 es mnima
n
}

(3.22)

n
0
n
= [hij ]
donde H
1in+1,1jn , la solucin aproximada ser u = u + V n y ,
n
y el vector residual ser
&
'
yn .
rn = r0 AV n y n = V n+1 0 e1 H
(3.23)
n

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
donde (V ) =

3.3

V 
es el nmero de condicionamiento de V .
V 1 

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 implementacin 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 diferencias 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 almacenados 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

d5 a5 b5
c5
A = e5
(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 Diagonal Storage (CDS), optimizado para ser usado en C++, para su almacenamiento y posterior recuperacin. Para este ejemplo en particular, se har uso
de un vector de ndices

(3.26)

Ind = [5, 1, 0, +1, +5]


y los datos sern almacenados usando la

0 0
0 d2

0 d3

0 d4

Dat =
e5 d5
e6 d6

e7 d7

e8 d8
e9 d9

estructura
a1
a2
a3
a4
a5
a6
a7
a8
a9

b1
b2
b3
b4
b5
b6
b7
b8
0

c1
c2
c3
c4
c5
0
0
0
0

(3.27)

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 particulares 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
b
c
3
3
3

a4

b
4

a5
b5
c5
A=
(3.28)

a6 b6 c6

a7 b7 c7

a8
b8 c8
a9 b9
la cual puede ser almacenada usando el algoritmo (vase [13]) Jagged Diagonal 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

(3.29)
Ind =
3 6 9
1 2 3

7 8 9

4 7 8
7 8 0

y los datos sern almacenados usando la

a1
a2

a3

a4

Dat =
a5
a6

a7

a8
a9
antoniocarrillo@ciencias.unam.mx

44

estructura

b1 c1
b2 c2

b3 c3

b4 0

b5 c5

b6 c6

b7 c7

b8 c8
b9 0

(3.30)

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 multiplicacin 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

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 parciales 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 Ingeniera.
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/]
[http://www.mathworks.com/products/matlab/]

1 7 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 Stabilized
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 multiplataforma 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

Bibliografa

Referencias
[1] K. Hutter y K Jhnk, Continuum Methods of Physical Modeling, SpringerVerlag 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 Differential 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, Numerical 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 Programming Whit the Message Passing Interface. Scientific and Engineering Computation 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, SpringerVerlag, Berlin, 2005, 450p.
[20] Farhat, C. and Roux, F. X. A Method of Finite Element Tearing and Interconnecting 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 Lagrange 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) 15231544.
[23] Farhat C., Lesoinne M., Pierson K. A Scalable Dual-Primal Domain Decomposition Method, Numer. Linear Algebra Appl. 7 (2000) 687-714.
[24] Mandel J. & Tezaur R. On the Convergence of a Dual-Primal Substructuring Method, Numer. Math. 88(2001), pp. 5443-558.
[25] Mandel, J. Balancing Domain Decomposition. Comm. Numer. Meth. Engrg., 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 Decomposition by Constraints and Energy Minimization. Numer. Linear Algebra
Appl. 10 (2003) 639-659.
[29] Da Conceio, D. T. Jr., Balancing Domain Decomposition Preconditioners 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:15231544, 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 Primal 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 Vectors, 19th International Conference on Domain Decomposition Methods,
Zhangjiajie, China 2009. (Oral presentation). Internal report #5, GMMCUNAM, 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 AdvectionDiffusion 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 Problems: 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 DualPrimal Domain Decomposition Method. Numer. Linear Algebra Appl., 7(78):687-714, 2000.
[45] Yannis Fragakis and Manolis Papadrakakis, The Mosaic of High Performance Domain Decomposition Methods for Structural Mechanics: Formulation, 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 Simulation. 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 Decomposition 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 Solving Helmholtz Equation at any Wavenumber. International Journal of Numerical Analysis and Modeling, Series B, Volume 2, Number 1, Pages 91108, 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

You might also like