Está en la página 1de 24

Método de Diferencias Finitas para la Solución de

Ecuaciones en Derivadas Parciales


Jhon Jairo Ramı́rez R.
Carlos Andrés Vanegas G.
Andrés Mauricio Villegas R.
Universidad Eafit, Medellı́n, Colombia

1. Introducción
La teorı́a de Ecuaciones en Derivadas Parciales (EDP) se ha convertido en
uno de los campos de estudio más importantes en matemáticas, debido a su
frecuente aplicación en diferentes áreas de la fı́sica, ingenierı́a y otras ciencias.
Entre las EDP más representativas se encuentran la Ecuación de Laplace, la
Ecuación de Onda y la Ecuación de Calor.

La Ecuación de Laplace modela la distribución de temperatura en estado


estacionario para una región. Si u(x, y, z) representa la temperatura en un punto
(x, y, z) en la región, la distribución se obtiene al solucionar la ecuación
∇2 u = 0
Esta ecuación aparece en muchos otros problemas de la fı́sica como: Potenciales
Electrostáticos, Potenciales en Hidrodinámica y Potenciales Armónicos en la
Teorı́a de la Elasticidad.

La Ecuación de Calor constituye una herramienta de gran utilidad para dar


solución a problemas de flujo de calor en cuerpos determinados. Si u(x, y, z, t)
es la temperatura en el punto (x, y, z), en un instante t, la ecuación es
ut = k∇2 u
Esta ecuación aparece también en una gran variedad de problemas de la
fı́sica matemática: por ejemplo, la concentración de material en difusión, la
propagación de olas en canales de gran longitud, y la transmisión en cables
eléctricos [4]. En la termodinámica, la ecuación de calor puede ser aplicada en
tres situaciones: cuerpos sólidos (tres dimensiones), placas (dos dimensiones), y
barras (una dimensión).

La Ecuación de Onda surge al describir fenómenos relativos a la propagación


de ondas en un medio continuo. Los estudios de ondas acústicas, ondas de agua,

1
ondas electromagnéticas y vibraciones mecánicas están basados en esta ecuación
[5]. Si u(x, y, t) representa la altura del punto (x, y) en el instante t, la ecuación
es
utt = c2 (uxx + uyy )
La deducción desde la fı́sica de las tres ecuaciones puede ser consultada en
[4]. Las soluciones de estas tres ecuaciones pueden calcularse mediante métodos
analı́ticos o aproximarse mediante métodos numéricos. Es el propósito de este
proyecto ilustrar el método numérico de diferencias finitas para el cálculo de
la solución de las Ecuaciones de Calor y de Onda para el caso unidimensional,
y comparar los resultados obtenidos mediante este método con los resultados
analı́ticos, para un caso particular.

2. Planteamiento del Problema


La ecuación de calor unidimensional ut = kuxx aplicarı́a, por ejemplo, para
el caso de una barra metálica larga y delgada, con aislamiento, ya que la tempe-
ratura de cualquier sección transversal serı́a constante, debido a que el tiempo
que tarda la temperatura en equilibrarse en distancias cortas se asume como
despreciable.
En este caso, si asumimos que la barra tiene una longitud l, una temperatura
inicial f (x), y que los extremos se mantienen a temperatura cero, la distribución
de temperatura en la barra está dada por la solución del problema de valores
iniciales y en la frontera:

ut = kuxx 0<x<l t>0 (1)


u(0, t) = 0 (2)
u(l, t) = 0 (3)
u(x, 0) = f (x) 0≤x≤l (4)

Este problema puede resolverse por medio del método analı́tico de separación
de variables, que se explica en [4]. La solución es:

" Z #
2 l nπτ nπ 2 nπx
dτ e( l ) kt sin
X
u(x, t) = f (τ ) sin
n=1
l 0 l l

En el caso de la Ecuación de Onda, se supondrá que la ecuación representa


el movimiento de una cuerda elástica de longitud a sujeta por los extremos,
eligiendo el eje x para representar la posición original de la cuerda. Se supone
que dicha cuerda se pone en movimiento mediante alguna fuerza externa, de
forma que empieza a vibrar en el plano horizontal, donde u = u(x, t) representa
el desplazamiento vertical en el punto x y en el instante t, siendo la ecuacion
que verifica tal desplazamiento

2
∂2u ∂2u
2
= c2 2 , 0 < x < a y 0 < t < b
∂t ∂x
Para obtener una solución única de esta ecuación es preciso añadir también
unas condiciones iniciales y de contorno apropiadas, que representarán distintos
tipos de fenómenos oscilatorios. Las condiciones de contorno deben reflejar que
los extremos de la cuerda son fijos, por lo que serán de la forma

u(0, t) = 0 = u(a, t) 0<t<b

Como en la ecuación de onda aparece una derivada de segundo orden respecto


a t, hay que imponer dos condiciones iniciales respecto a ella. Estas pueden
consistir en fijar la posición y la velocidad inicial de los puntos de la cuerda,
expresandose
u(x, 0) = f (x) 0 ≤ x ≤ a
ut (x, 0) = g(x) 0 < x < a
Con el método de separacı́ón de variables se obtiene la siguiente solución analı́tica
a la ecuación de onda
∞ 
X nπc nπc  nπx
u(x, t) = An cos t + Bn sin t sin
n=1
a a a
donde Z a
2 nπx
An = f (x) sin dx
a 0 a
y Z a
2 nπx
Bn = g(x) sin dx
nπc 0 a

3. Justificación del uso de Métodos Numéricos


en la Solución de EDP
Los métodos de aproximación analı́tica a la solución de EDP, proporcionan
frecuentemente información útil acerca del comportamiento de la solución en
valores crı́ticos de la variable dependiente, pero tienden a ser más difı́ciles de
aplicar que los métodos numéricos. Entre las consideraciones que justifican el
uso de métodos numéricos para solucionar ciertos tipos de ecuaciones diferen-
ciales ordinarias y en derivadas parciales se encuentran: 1) Los datos de los
problemas reales presentan siempre errores de medición, y el trabajo aritmético
para la solución está limitado a un número finito de cifras significativas que
resultan en errores de redondeo. Por lo tanto, incluso los métodos analı́ticos
proporcionan resultados que son aproximaciones numéricas; 2) La evaluación

3
numérica de las soluciones analı́ticas es a menudo una tarea laboriosa y com-
putacionalmente ineficiente, mientras que los métodos numéricos generalmente
proporcionan soluciones numéricas adecuadas, de manera más simple y eficiente
[6]. De los métodos de aproximación numérica disponibles para resolver ecua-
ciones diferenciales, los más utilizados son el método de diferencias finitas y el
método de elementos finitos. En este proyecto sólo se trabajó con el método de
diferencias finitas.

4. Método de Diferencias Finitas


Sı́ u es una función de x con derivadas finitas y continuas, entonces por el
teorema de Taylor se tiene que:
1 1
u(x + h) = u(x) + hU 0 (x) + h2 u00 (x) + h3 u000 (x) + . . . (5)
2 6
y
1 1
u(x − h) = u(x) − hU 0 (x) + h2 u00 (x) − h3 u000 (x) + . . . (6)
2 6
Al sumar estas expansiones se obtiene:
u(x + h) + u(x − h) = 2u(x) + h2 u00 (x) + o(h)4 (7)
donde o(h4 ) denota los términos que contienen potencias de h de orden 4 o
mayor. Asumiendo que estos términos son pequeños en relación con las potencias
menores de h, se sigue que:
1
u00 (x) ' {u(x + h) − 2u(x) + u(x − h)} (8)
h2
con un error de orden h2 . Al restar la ecuación (6) de la ecuación (5), y despreciar
los términos de orden h3 se obtiene:
1
u0 (x) ' {u(x + h) − u(x − h)} (9)
2h
con un error de orden h2 .
La ecuación (9) aproxima la pendiente de la tangente en el punto (x, u(x))
mediante la pendiente de la recta que pasa por los puntos (x − h, u(x − h)) y
(x+h, u(x+h)). Esta aproximación se conoce como aproximación por diferencia
central. También se puede aproximar la pendiente de la tangente en (x, u(x))
por la pendiente de la recta que pasa por los puntos (x, u(x)) y (x+h, u(x+h)).,
obteniendo la aproximación por diferencias regresivas
1
u0 (x) ' {u(x) − u(x − h)} (10)
h
o por la pendiente de la recta que pasa por los puntos (x − h, u(x − h)) y
(x, u(x))., obteniendo la aproximación por diferencias progresivas
1
u0 (x) ' {u(x + h) − u(x)} (11)
h

4
Ahora, tomemos una función u de las variables x y t. Subdividamos el plano
x − t en un conjunto de rectángulos iguales de lados δx = h y δt = k mediante
lı́neas igualmente espaciadas y paralelas al eje t, definidas por xi = ih, i =
0, ±1, ±2, . . . y lı́neas igualmente espaciadas y paralelas al eje x definidas por
yj = jk, j = 0, ±1, ±2, . . . ,. Denotemos el valor de u en un punto P (ih, jk) de
la malla como:
uP = uih,jk = ui,j
Entonces, por la ecuación (8)
 2   2 
∂ u ∂ u u{(i + h)h, jk} − 2u{ih, jk} + u{(i − 1)h, jk}
= '
∂x2 P ∂x2 i,j h2

que equivale a
∂2u
 
ui+1,j − 2ui,j + ui−1,j
' (12)
∂x2 i,j h2
De manera similar,

∂2u
 
ui,j+1 − 2ui,j + ui,j−1
' (13)
∂t2 i,j k2

De las ecuaciones (10) y (11) se sigue que dos aproximaciones para δu/δt en P
son
∂u ui,j+1 − ui,j
' (diferencias progresivas) (14)
∂t k2
∂u ui,j − ui,j−1
' (diferencias regresivas) (15)
∂t k2

5. Soluciones propuestas al Problema


Para la Ecuación de Calor se plantean tres variantes del método de diferen-
cias finitas: Diferencias Progresivas, Diferencias Regresivas y Método de Crank-
Nicolson. Para la Ecuación de Onda se emplea un método iterativo generado a
partir de diferencias finitas.

5.1. Diferencias Finitas para la Ecuación de Calor


Consideremos el problema planteado en las ecuaciones (2)-(4). De las ecua-
ciones (14) y (12) se sigue que una aproximación por diferencias finitas a

∂u ∂2u
= α2 2
∂t ∂x
es
ui,j+1 − ui,j ui+1,j − 2ui,j + ui−1,j
= α2 (16)
k h2

5
donde u es la solución exacta a las ecuaciones aproximadas, xi = ih, (i =
0, 1, 2, m − 1 . . .), ti = jk, (j = 0, 1, 2, . . .) y m = l/h. La ecuación (16) puede
ser reescrita como

ui,j+1 = λui−1,j + (1 − 2λ)ui,j + λui+1,j (17)

donde λ = α2 (k/h2 ). Dado que la condición inicial u(x, 0) = f (x), para todo
0 ≤ x ≤ l, implica que ui,0 = f (xi ), para toda i = 0, 1, 2, . . . , m, podemos
usar estos valores en la ecuación (17) para calcular el valor de ui,1 para toda
i = 1, 2, . . . , m − 1. Las condiciones iniciales u(0, t) = 0 y u(l, t) = 0 implican
que u0,1 = um,1 = 0 y, por tanto, podemos determinar todos los elementos de
la forma ui,1 . Ya conocidas todas las aproximaciones ui,1 se pueden obtener,
siguiendo un procedimiento semejante, los valores ui,2 , ui,3 , . . .

Si hacemos u(0) = (f (x1 ), f (x2 ), . . . , f (xm−1 ))t y u(j) = (u1j , u2j , . . . , um−1,j )t ,
para todo j = 1, 2, . . . , se puede plantear matricialmente este método de solución
como:
u(j) = Au(j−1) , para todo j = 1, 2, . . .
donde A es la siguiente matriz tridiagonal

(1 − 2λ)
 
λ 0 ............. 0
 .. .. 
 λ (1 − 2λ) λ . . 
.
 
 . .. .. 
 0 
A= 
.

.. . ..


 0 

 .
. . .

 . . λ (1 − 2λ) λ 
0 ............. 0 λ (1 − 2λ)
w(j) se obtiene para w(j−1) por una multiplicación simple de matrices. A
esto se le conoce con el nombre de método de diferencias progresivas. A pesar
de la simplicidad para obtener soluciones, el método es inestable para λ > 1/2.
Por tanto se propone un segundo método. Una discusión más amplia sobre el
problema de estabilidad se presenta en [1].

Si en la ecuación (16) reemplazamos el lado izquierdo por (15) se obtiene la


siguiente aproximación en diferencias finitas a la ecuación de calor
ui,j − ui,j−1 ui+1,j − 2ui,j + ui−1,j
= α2 (18)
k h2
Que se puede reescribir como

(1 + 2λ)ui,j − λui+1,j − λui−1,j = ui,j−1 (19)

Aplicando el hecho de que wi,0 = f (xi ) para toda i = 1, 2, . . . , m − 1 y wm,j =


w0,j = 0 para toda j = 1, 2, . . ., este método de diferencias tiene la repre-

6
sentación matricial:
−λ
 
(1 + 2λ) 0 ............. 0
 .. .. 
 −λ (1 + 2λ) −λ . . 
w1,j
 
w1,j−1

..
 
 ..   w2,j 
  w2,j−1 
 0 . .  .  =
 

.. ..  .    .. 
. .

 . . 0   
 wm−1,j wm−1,j−1
 
 .
.. ..
 . −λ (1 + 2λ) −λ 
0 ............. 0 −λ (1 + 2λ)
(20)
o Aw(j) = w(j+1) para toda j = 1, 2, . . .

Ası́ debemos resolver ahora un sistema lineal para obtener w(j) a partir de
w(j−1) . Este método se conoce como el método de diferencias regresivas, y es
estable para cualquier λ.

Dado que λ > 0, la matriz A es definida positiva y estrictamente dominante


en forma diagonal, además de ser tridiagonal. Para resolver este sistema, pode-
mos emplear la factorización LU de Crout para sistemas lineales tridiagonales.
En este algoritmo suponemos, para propósitos de detención o paro, que se da
una cota para t [1].

Con el método de diferencias regresivas se solucionó el problema de estabi-


lidad. Sin embargo, para evitar la falta de precisión, generada por el error de
truncamiento, se requiere que los intervalos de tiempo sean mucho más pequeños
que los de espacio (h >> k), y esto reduce su eficiencia. Por tanto, se hace nece-
sario un método que permita tomar valores similares para h y k, y que además
sea estable para todo λ. Este método se puede obtener al promediar el método
de diferencias progresivas en el j-ésimo paso en t,
ui,j+1 − ui,j ui+1,j − 2ui,j + ui−1,j
= α2
k h2
y el método de diferencias regresivas en el (j + 1)-ésimo paso en t
ui,j+1 − ui,j ui+1,j+1 − 2ui,j+1 + ui−1,j+1
= α2
k h2
Entonces se tiene que una aproximación por diferencias para la ecuación de calor
es
α2 ui+1,j − 2ui,j + ui−1,j
 
ui,j+1 − ui,j ui+1,j+1 − 2ui,j+1 + ui−1,j+1
= +
k 2 h2 h2

que puede ser reescrito como


λ λ λ λ
− ui−1,j+1 + (1 + λ)ui,j+1 − ui+1,j+1 = ui−1,j + (1 − λ)ui,j + ui+1,j
2 2 2 2

7
Al método generado por esta aproximación se le llama método de Crank-
Nicolson y esta representado de forma matricial como

Aw(j+1) = Bw(j) (21)

donde
− λ2
 
(1 + λ) 0 ............ 0
λ .. ..
(1 + λ) − λ2
 
 −
2
. . 
..
 
 .. 
 0 . . 
A=
 .

 .. .. 
 . 0 

 . ..
 ..

. − λ2 (1 + λ) − λ2 
λ
0 ............ 0 −2 (1 + λ)
y
λ
(1 − λ)
 
2 0 ............ 0
 λ .. ..
(1 − λ) λ2

 . . 
 2
..

 .. 
 0 . . 
B=
 .

 .. .. 
 . 0 

 . ..
.

. λ λ
 .
2 (1 − λ) 2

λ
0 ............ 0 2 (1 − λ)
j+1 j+1
Para obtener w a partir de w , se debe resolver el sistema planteado
en (21).La matriz A es definida positiva, estrictamente dominante en forma
diagonal y tridiagonal. Para resolver este sistema, se puede usar la factorización
LU de Crout para sistemas lineales tridiagonales. Al igual que en el método de
diferencias regresivas, en este algoritmo se supone, para propósitos de detención
o paro, que se da una cota para t.

5.2. Diferencias Finitas para la Ecuación de Onda


El dominio de la ecuación diferencial parcial de onda esta dado por el
rectángulo R = {(x, t) : 0 ≤ x ≤ a, 0 ≤ t ≤ b}, a partir del cual se inducirá una
partición, generando ası́ una malla que consta de n − 1 por m − 1 rectángulos
de lados ∆x = h y ∆t = k.
Definido el tamaño de la malla, se establece la siguiente notación
u(x, t) = ui,j
u(x + h, t) = ui+1,j
u(x − h, t)) = ui−1,j
u(x, t + k)) = ui,j+1
u(x, t − k)) = ui,j−1

8
Se usara la ecuación en diferencias para calcular los valores sucesivos que se
aproximen a la solución exacta, que en los puntos de la malla es u(xi , tj ). Para
cada j = 2, 3, ..., m se calculara

{ui,j ≈ u(xi , tj ) : i = 1, 2, ..., n}.

Teniendo en cuenta la notación establecida anteriormente, y las expresiones (12)


y (13) se construye la ecuación en diferencias
ui,j+1 − 2ui,j + ui,j−1 ui+1,j − 2ui,j + ui−1,j
= c2 (22)
k2 h2
ck
Al hacer α = en (22), se obtiene
h
ui,j+1 − 2ui,j + ui,j−1 = α2 (ui+1,j − 2ui,j + ui−1,j ) (23)

Al resolver para ui,j+1 , o sea, la aproximación más avanzada del paso del tiempo,
y reordenar los términos, se tiene

ui,j+1 = (2 − 2α2 )ui,j + α2 (ui+1,j + ui−1,j ) − ui,j−1 (24)

La ecuación (24) es aplicable para i = 2, 3, ..., n − 1 y j = 2, 3, ..., m − 1. Esta


expresión sigiere que el (j + 1)-ésimo paso de tiempo requiere de los j-ésimo y
los (j − 1)-ésimo pasos. Los valores del (j − 1)-ésimo paso vienen dados por las
condiciones iniciales ui,1 = f (xi ). sin embargo, los valores del j-ésimo paso no
se suelen proporcionar, por lo que se usa g(x) para conseguir los valores de este
paso.
Un algoritmo es estable si el error cometido en una etapa no se amplı́a en las
etapas posteriores. para garantizar la estabilidad de este método es necesario
ck
que α = ≤ 1.
h
Se desarrolla el polinomio de taylor de orden uno para u(x, t) alrededor de
(xi , 0).
u(xi , k) = u(xi , 0) + ut (xi , 0)k + O(k 2 ) (25)
Se aplica el hecho de que u(xi , 0) = f (xi ) = fi y ut (xi , 0) = g(xi ) = gi en (22),
para obtener aproximacioines numéricas en el j-ésimo paso (se sabe que t2 = k)

ui,2 = fi + kgi para i = 2, 3, . . . , n − 1 (26)

Ya que la fórmula (26) es una aproximación lineal a los valores del j-ésimo paso,
el error de truncamiento introducido al usarla es significativo. Por lo tanto,
para evitar que los valores ui,2 calculados con la fórmula (23) introduzcan en el
proceso un error considerable, se debe elegir un tamaño de paso k pequeño en
comparación con h.
En el caso de que f (x) sea dos veces derivable en el intervalo 0 ≤ x ≤ a, se
podrı́a obtener una mejor aproximación a ui,2 . Se sabe que uxx (x, 0) = f 00 (x),
igualdad que permite desarrollar la fórmula de Taylor de orden dos para obtener

9
una aproximación mejórada de los valores del j-ésimo paso. Si se toma como
x = xi y t = 0 en la ecuación diferencial parcial de onda, se obtiene
fi+1 − 2fi + fi−1
utt (xi , 0) = c2 uxx (xi , 0) = c2 f 00 (xi ) = c2 + O(h2 ) (27)
h2
fi+1 − 2fi + fi−1
En la fórmula anterior se usó el hecho de que f 00 (xi ) = , lo
h2
cual podrı́a ser sustentado en el desarrollo de la formula (7). Ahora se desarrolla
el polinomio de Taylor de grado dos

u(x, k) = u(x, 0) + ut (x, 0)k + 12 utt (x, 0)k 2 + O(k 3 ) (28)

Al hacer x = xi en (28) y al aplicar las expresiones (26) y (27) en esta misma

c2 k 2
u(xi , k) = fi + kgi + (fi+1 − 2fi + fi − 1) + O(h2 )O(k 2 ) + O(k 3 ) (29)
2h2
ck
Ya que α = , la fórmula (29) se puede simplificar, a fin de obtener aproxima-
h
ciones mejoradas para el j-ésimo paso.

α2
ui,2 = (1 − α2 )fi + kgi + (fi+1 + fi−1 ) para i = 2, 3, ..., n − 1. (30)
2
A partir de estos resultados, se puede desarrollar un algoritmo iterativo en el que
un paso subsiguiente se resuelve a partir de los dos inmediatamente anteriores.

5.3. Algoritmos
A continuación se presentan los pseudocódigos de las tres variantes del méto-
do de Diferencias Finitas para la ecuación de calor, y del método de Diferencias
Finitas para la ecuación de onda. Se anexa a este trabajo la implementación de
estos pseudocódigos en MATLAB . r

10
Algoritmo 1 Método de diferencias progresivas
Entrada: extremo l; tiempo máximo T ; constante α; enteros m >= 3, n >= 1.
Salida: aproximaciones ui,j a u(xi , tj ) para toda i = 1, . . . , m − 1 y j =
1, . . . , N .
1: h = l/m, k = T /N , λ = α2 k/h2 , um , j = 0 Para j = 0, . . . , N , vm = 0
2: Para i = 1, . . . , m − 1 Haga
3: ui,0 = f (ih) (Calculo de valores iniciales)
4: Fin
5: Para j = 1, . . . , N Haga
6: t = jk
7: u1.j = (1 − 2λ)v1 + λv2
8: Para i = 2, . . . , m − 1 Haga
9: ui,j = (1 − 2λ)vi + λ(vi+1 + vi−1 )
10: Fin
11: Para i = 1, . . . , m − 1 Haga
12: vi = ui,j
13: Fin
14: Fin
15: Muestre u

Algoritmo 2 Método de las diferencias regresivas


Entrada: extremo l; tiempo máximo T ; constante α; enteros m >= 3, n >= 1.
Salida: aproximaciones ui,j a u(xi , tj ) para toda i = 1, . . . , m − 1 y j =
1, . . . , N .
1: h = l/m; k = T /N ; λ = α2 k/h2 .
2: Para i = 1, . . . , m − 1 Haga
3: ui,0 = f (ih) (Calculo de valores iniciales)
4: Fin
5: Li = 1 + 2λ, U1 = −λ/L1 (Los pasos 5-20 solucionan el sistema tridiagonal)
6: Para i = 2, . . . , m − 2 Haga
7: Li = 1 + 2λ + λUi−1
8: Ui = −λ/Li
9: Fin
10: lm−1 = 1 + 2λ + λUm−2
11: Para j = 1, . . . , N Haga
12: t = jk, z1 = u1,j−1 /L1
13: Para i = 2, . . . , m − 1 Haga
14: zi = (ui,j−1 + λzi−1 )/Li
15: Fin
16: um−1,j = zm−1
17: Para i = m − 2, . . . , 1 Haga
18: ui,j = zi − Ui ui+1,j
19: Fin
20: Fin
21: Muestre u

11
Algoritmo 3 Método de Crank-Nicolson
Entrada: extremo l; tiempo máximo T ; constante α; enteros m >= 3, n >= 1.
Salida: aproximaciones ui,j a u(xi , tj ) para toda i = 1, . . . , m − 1 y j =
1, . . . , N .
1: h = l/m, k = T /N , λ = α2 k/h2 , um , j = 0 Para j = 0, . . . , N
2: Para i = 1, . . . , m − 1 Haga
3: ui,0 = f (ih) (Calculo de valores iniciales)
4: Fin
5: Li = 1+λ, U1 = −λ/(2L1 ) (Los pasos 5-21 solucionan el sistema tridiagonal)
6: Para i = 2, . . . , m − 2 Haga
7: Li = 1 + λ + λUi−1 /2
8: Ui = −λ/(2Li )
9: Fin
10: lm−1 = 1 + λ + λUm−2 /2
11: Para j = 1, . . . , N Haga
12: t = jk 
λ
13: z1 = (1 − λ)u1,j−1 + u2,j−1 /L1
2
14: Para i = 2, . . . , m − 1 Haga 
λ
15: zi = (1 − λ)ui,j−1 + (ui+1,j−1 + ui−1,j−1 + zi−1 )
2
16: Fin
17: um−1,j = zm−1
18: Para i = m − 2, . . . , 1 Haga
19: ui,j = zi − Ui ui+1,j
20: Fin
21: Fin
22: Muestre u

Algoritmo 4 Método de diferencias finitas para la ecuación de calor


Entrada: u(x, 0) = f (x), ut (x, 0) = g(x), a, b, c, n, m.
Salida: U , matriz con la solución númerica.
1: h = a/(n − 1),k = b/(m − 1),α = ck/h, Ui,j = 0 Para todo i, j
2: Para i = 2, 3, . . . , n − 1 Haga
3: Ui,1 = f (h(i − 1))
α2
4: Ui,2 = (1 − α2 )f (h(i − 1)) + kg(h(i − 1)) + (f (hi) + f (h(i − 2)))
2
5: Fin
6: Para j = 3, 4, . . . , m Haga
7: Para i = 2, 3, . . . , n − 1 Haga
8: Ui,j = (2 − 2α2 )Ui,j−1 + α2 (Ui−1,j−1 + Ui+1,j−1 ) − Ui,j−2
9: Fin
10: Fin

12
6. Ejemplos
Se presentan dos ejemplos con el propósito de comparar los resultados analı́ticos
con los resultados obtenidos con el método de diferencias finitas.

6.1. Ejemplo Ecuación de Calor


Presentamos los resultados de la ecuación de calor para unas condiciones
iniciales y de frontera determinadas, obtenidos mediante cuatro métodos dife-
rentes: analı́tico, diferencias progresivas, diferencias regresivas y Crank Nicolson.

Supongamos que se quiere determinar la distribución de temperatura en


cualquier instante t de una barra de cobre (α ≈ 1) con l = 1, que presenta una
función de temperatura inicial dada por f (x) = sin(π ∗ x). Mediante un proce-
dimiento matemático puede verificarse que la solución analı́tica a este problema
está dada por
2
u(x, t) = e−π t sin(πx)
Para calcular las soluciones utilizando los tres métodos numéricos menciona-
dos, se establecieron los valores de las constantes que intervienen en los algorit-
mos que se presentaron anteriormente: m = 10, N = 100, T = 10, y se ejecutaron
las rutinas escritas en MATLAB para cada uno de los métodos. En las tablas se
presentan los valores de la distribución de temperatura de la barra en t = 0,25,
calculados por los métodos de diferencias regresivas, diferencias progresivas y
Crank-Nicolson respectivamente.

Notese que el porcentaje de error en Crank-Nicolson es de 1.8 % mientras


que el de diferencias regresivas es de 14.2 %, y que el método de diferencias pro-
gresivas no converge para el valor de lambda utilizado (λ = 1). Estos resultados
son coherentes con lo que se esperaba. En la tabla 2 se presentan los valores
calculados con el método de diferencias progresivas con λ = 0,1, que se obtuvo
al disminuir diez veces el valor de k. Si recordamos que k es el paso para t,
podemos ver que lo que se hizo fue refinar el cálculo de los valores en el tiempo.

13
Diferencias Progresivas Error relativo
xi u(xi , 0,25) × 10−2 upi,500 × 10−2 |up − u|/u × 10−2
0.0 0 0
0.1 2.621 2.658 1.432
0.2 4.985 5.056 1.432
0.3 6.861 6.959 1.432
0.4 8.065 8.181 1.432
0.5 8.480 8.602 1.432
0.6 8.065 8.181 1.432
0.7 6.861 6.959 1.432
0.8 4.985 5.056 1.432
0.9 2.621 2.658 1.432
1.0 0 0

Tabla 1: Valores de la distribución de temperatura de la barra en t = 0,25


calculados por el método de sustitución progresiva(h = 0,1, k = 0,0005, λ = 0,05

Diferencias Progresivas Error relativo


xi u(xi , 0,33) × 10−2 upi,33 × 10−2 |up − u|/u × 10−2
0.0 0 0
0.1 1.190 -1.581 232.8
0.2 2.263 6.900 204.9
0.3 3.115 -4.025 229.2
0.4 3.662 0.980 199.8
0.5 3.850 -4.748 223.3
0.6 3.662 0.753 193.6
0.7 3.115 -3.657 217.4
0.8 2.263 6.531 188.6
0.9 1.190 -1.353 213.7
1.0 0 0

Tabla 2: Valores de la distribución de temperatura de la barra en t = 0,33


calculados por el método de sustitución progresiva(h = 0,1, k = 0,01, λ =

14
Diferencias Regresivas Error relativo
xi u(xi , 0,25) × 10−2 uri,25 × 10−2 |ur − u|/u × 10−2
0.0 0 0
0.1 2.621 2.993 14.19
0.2 4.985 5.692 14.18
0.3 6.861 7.835 14.20
0.4 8.065 9.210 14.20
0.5 8.480 9.684 14.20
0.6 8.065 9.210 14.20
0.7 6.861 7.835 14.20
0.8 4.985 5.692 14.18
0.9 2.621 2.993 14.19
1.0 0 0

Tabla 3: Valores de la distribución de temperatura de la barra en t = 0,25


calculados por el método de sustitución regresiva (h = 0,1, k = 0,01, λ = 1)

Crank-Nicolson Error relativo


xi u(xi , 0,25) × 10−2 uci,25 × 10−2 |uc − u|/u × 10−2
0.0 0 0
0.1 2.621 2.669 1.844
0.2 4.985 5.077 1.844
0.3 6.861 6.987 1.844
0.4 8.065 8.214 1.844
0.5 8.480 8.637 1.844
0.6 8.065 8.214 1.844
0.7 6.861 6.987 1.844
0.8 4.985 5.077 1.844
0.9 2.621 2.669 1.844
1.0 0 0

Tabla 4: Valores de la distribución de temperatura de la barra en t = 0,25


calculados por el método de Crank-Nicolson(h = 0,1, k = 0,01, λ = 1)

15
xi ui,21 E
0.0 0 0
0.1 0.3090169944 5.55e-017
0.2 0.5877852523 2.22e-016
0.3 0.8090169944 0.0000000
0.4 0.9510565163 3.33e-016
0.5 1.0000000000 0.0000000
0.6 0.9510565163 1.11e-016
0.7 0.8090169944 0.0000000
0.8 0.5877852523 0.0000000
0.9 0.3090169943 5.55e-017
1.0 0 0

Tabla 5: Valores de la altura de la cuerda en t = 1 calculados por el método de


diferencias finitas(h = 0,1, k = 0,05)

6.2. Ejemplo Ecuación de Onda


Se ha dicho que el método descrito genera soluciones confiables cuando
α = ck/h ≤ 1. Una forma de evaluar el método es simplemente comparando, en
un caso especifico, la solución aproximada con la verdadera.
Considérese la ecuación
∂2u ∂2u
2
= 4 2, 0 < x < 1 y 0 < t < 1
∂t ∂x
con las condiciones de frontera

u(0, t) = 0 = u(1, t), 0<t<1

y con las condiciones iniciales

u(x, 0) = sen(πx), 0 ≤ x ≤ 1 y ut (x, 0) = 0, 0≤x≤1

La ecuación de onda cuenta con procedimientos analı́ticos que permiten ha-


llar su solución, por lo que será fácil verificar que la solución a este problema
es
u(x, t) = sen(πx)cos(2πt)
se emplea el algoritmo desarrollado en la sección anterior con n = 11, m = 21,
lo cual significa que h = 0,1, k = 0,05 y α = 1. En la tabla 5 se comparan
los resultados obtenidos con la solución numérica y la analı́tica para t = 1, y
se muestra el error absoluto que nos indica el número de cifras correctas halla-
das con la aproximación numérica. En el peor de los casos, se entregó dieciséis
decimales corectos.

16
7. Conclusión y Trabajo Posterior
Las Ecuaciones en Derivadas Parciales constituyen uno de los principales
campos de estudio en matemáticas, debido a su creciente aplicación en fı́sica,
ingenierı́a y otras ciencias. Se ha visto que por lo general la solución de una EDP
no es expresable en terminos de funciones elementales, lo que dificulta el cálcu-
lo de las soluciones analiticas. Por lo tanto es recomendable emplear métodos
numéricos para resolver EDP cuando, para fines prácticos, basta generar solu-
ciones aproximadas, pero de manera eficiente. El Método de Diferencias Finitas
es una herramienta útil para calcular aproximaciones a las soluciones de algunas
EDP, en particular la Ecuación de Calor y la Ecuación de Onda.

Para el caso de la ecuación de Calor se observó que generalmente el método


más adecuado es el de Crank Nicolson, debido a que presentó el menor error
relativo para los ejemplos desarrollados, y a que su convergencia no depende del
valor de λ utilizado. En el caso de la ecuación de Onda, el método de diferencias
finitas desarrollado presenta convergencia siempre que α ≤ 1.

Como trabajo posterior para el tema aquı́ desarrollado, se propone la ex-


pansión de las variantes del método de Diferencias Finitas al caso dos y tres
dimensional para la ecuación de calor, y dos dimensional para la ecuación de
onda. La implementación del método para estos casos ampliarı́a su aplicabilidad
a problemas como el flujo de calor en láminas y sólidos, y la vibración de una
membrana elástica. Por otra parte, se propone el uso del método de elementos
finitos como método alternativo que permita, entre otras cosas, aplicar las ecua-
ciones de Calor y Onda a membranas y sólidos con formas irregulares, como los
que generalmente se encuentran en aplicaciones industriales.

Referencias
[1] Burden, R. and Faires, J. Análisis Númerico. Thomson Learning, Mexico,
D.F. 2002
[2] Harrel, E. and Herod, J. Linear Methods of Applied Mathematics. 1996.
Tomado de: http://www.mathphysics.com/pde/HEderiv.html
[3] Mathews, J. and Fink, K. Métodos numéricos con Matlab. Prentice Hall.
Madrid. 1999.
[4] Myint-U, T. Partial differential equations o mathematical physics. Elservier
North-Holland, New York. 1978.
[5] Serway, R. and Beichner, FÍSICA para ciencias e ingenierı́a I. Mc Graw
Hill. México. 2001.
[6] Smith, G. Numerical Solution of Partial Differential Equations: Finite Dif-
ference Methods. Oxford University Press, New York.1999.

17
Anexos (Códigos en Matlab)
Método de diferencias progresivas
%Metodo de diferencias progresivas
%La matriz W contiene los resultados del metodo. Las columnas corresponden
%a la variacion en el tiempo, y las filas a la variacion en x.
clear
close all
clc
%Entrada de datos
Preguntas={’Longitud de la barra: ’
’Limite de Tiempo’
’Numero de particiones en el tiempo’
’Numero de particiones en x’
’Coeficiente alfa’
’Funcion de temperatura inicial’};
Titulo = ’Entrada de Datos (Metodo de diferencias progresivas)’;
Defecto = {’1’, ’0.40’ , ’40’ , ’10’ , ’1’ , ’sin(pi*x)’};
datos=inputdlg(Preguntas, Titulo, 1, Defecto);
L=str2num(datos{1});
T=str2num(datos{2});
N=str2num(datos{3});
m=str2num(datos{4});
alfa=str2num(datos{5});
f=datos{6};
%Incializacion
h=L/m;
k=T/N;
lambda=alfa^2*k/h^2;
v(m,1)=0;
w(m,1)=0;
W=[];
x=sym(’x’);
%Obtencion de la solucion
%Obtencion de los resultados
for(i=1:m-1)
x=i*h;
v(i,1)=eval(f);
end
W=[W;v’];
for j=1:N
t=j*k;
w(1,1)=((1-2*lambda)*v(1,1)+lambda*v(2,1));
for i=2:m-1
w(i,1)=(1-2*lambda)*v(i,1)+lambda*(v(i+1,1)+v(i-1,1));

18
end
v=w;
W=[W;v’];
end
%Graficacion de los resultados
num_rows=size(W,1);
zeros_col=zeros(num_rows,1);
W=[zeros_col W];
plot(W(1,:));
limites=axis;
maximo=limites(4);
for(a=2:size(W,1))
plot(W(a,:))
limites=[1 m+1 0 maximo];
axis(limites);
pause(0.01)
end
title(’Temperatura vs. x’)
ylabel(’u(x)’)
xlabel(’x’)
figure
surf(W)
title(’Superficie de Distribucion de Temperatura’)
ylabel(’t’)
xlabel(’x’)
zlabel(’u(x,t)’)
shading interp

Método de diferencias regresivas


%Metodo de diferencias regresivas. W contiene la matriz con la solucion
%La matriz W contiene los resultados del metodo. Las columnas corresponden
%a la variacion en el tiempo, y las filas a la variacion en x.
close all
clear all
clc
%Entrada de datos
Preguntas={’Longitud de la barra: ’
’Limite de Tiempo’
’Numero de particiones en el tiempo’
’Numero de particiones en x’
’Coeficiente alfa’
’Funcion de temperatura inicial’};
Titulo = ’Entrada de Datos (Metodo de diferencias progresivas)’;
Defecto = {’1’, ’0.40’ , ’40’ , ’10’ , ’1’ , ’sin(pi*x)’};
datos=inputdlg(Preguntas, Titulo, 1, Defecto);

19
l=str2num(datos{1});
T=str2num(datos{2});
N=str2num(datos{3});
m=str2num(datos{4});
alpha=str2num(datos{5});
f=datos{6};
x=sym(’x’);
%Inicializacion
h=l/m;
k=T/N;
lambda=((alpha^2)*k)/h^2;
W=[];
w=[];
%Obtencion de la solucion
for(i=1:m-1)
x=i*h;
w(1,i)=eval(f);
end
W=[W;w];
L=[];
u=[];
L(1)=1+2*lambda;
u(1)=-lambda/L(1);
for(i=2:m-2)
L(i)=1 + 2*lambda + lambda*u(i-1);
u(i)=-lambda/L(i);
end
L(m-1)=1 + 2*lambda + lambda*u(m-2);
for(j=1:N)
t=j*k;
z=[];
z(1)=w(1)/L(1);
for(i=2:m-1)
z(i)=(w(i) + lambda*z(i-1))/L(i);
end
w(m-1)=z(m-1);
for(i=m-2:-1:1)
w(i)=z(i) - u(i)*w(i+1);
end
W=[W;w];
end
%Grafica da la solucion
num_rows=size(W,1);
zeros_col=zeros(num_rows,1);
W=[zeros_col W zeros_col];
plot(W(1,:));

20
limites=axis;
maximo=limites(4);
for(a=2:size(W,1))
plot(W(a,:))
limites=[1 m+1 0 maximo];
axis(limites);
pause(0.01)
end
title(’Temperatura vs. x’)
ylabel(’u(x)’)
xlabel(’x’)
figure
surf(W)
title(’Superficie de Distribucion de Temperatura’)
ylabel(’t’)
xlabel(’x’)
zlabel(’u(x,t)’)
shading interp

Método de Crank-Nicolson
%Metodo de crank-nicoloson
%La matriz W contiene los resultados del metodo. Las columnas corresponden
%a la variacion en el tiempo, y las filas a la variacion en x.
clear
close all
clc
%Entrada de datos
Preguntas={’Longitud de la barra: ’
’Limite de Tiempo’
’Numero de particiones en el tiempo’
’Numero de particiones en x’
’Coeficiente alfa’
’Funcion de temperatura inicial’};
Titulo = ’Entrada de Datos (Metodo de diferencias progresivas)’;
Defecto = {’1’, ’0.40’ , ’40’ , ’10’ , ’1’ , ’sin(pi*x)’};
datos=inputdlg(Preguntas, Titulo, 1, Defecto);
L=str2num(datos{1});
T=str2num(datos{2});
N=str2num(datos{3});
m=str2num(datos{4});
alfa=str2num(datos{5});
f=datos{6};
%Incializacion
h=L/m;
k=T/N;

21
lambda=alfa^2*k/h^2;
v(m,1)=0;
W=[];
x=sym(’x’);
%Obtencion de los resultados
for(i=1:m-1)
x=i*h;
v(i,1)=eval(f);
end
%v(1:m-1,1)=(subs(f,(1:m-1)*h))’;
W=[W;v’];
l(1,1)=1+lambda;
u(1,1)=-lambda/(2*l(1,1));
for i=2:m-2
l(i,1)=1+lambda+lambda*u(i-1,1)/2;
u(i,1)=-lambda/(2*l(i,1));
end
l(m-1,1)=1+lambda+lambda*u(m-2,1)/2;
for j=1:N
t=j*k;
z(1,1)=((1-lambda)*v(1,1)+lambda/2*v(2,1))/l(1,1);
for i=2:m-1
z(i,1)=((1-lambda)*v(i,1)+lambda/2*(v(i+1,1)+v(i-1,1)+z(i-1,1)))/l(i,1);
end
v(m-1,1)=z(m-1,1);
for i=m-2:-1:1
v(i,1)=z(i,1)-u(i,1)*v(i+1,1);
end
W=[W;v’];
end
%Graficacion de la solucion
num_rows=size(W,1);
zeros_col=zeros(num_rows,1);
W=[zeros_col W];
plot(W(1,:));
limites=axis
maximo=limites(4);
for(a=2:size(W,1))
plot(W(a,:))
limites=[1 m+1 0 maximo];
axis(limites);
pause(0.01)
end
title(’Temperatura vs. x’)
ylabel(’u(x)’)
xlabel(’x’)

22
figure
surf(W)
title(’Superficie de Distribucion de Temperatura’)
ylabel(’t’)
xlabel(’x’)
zlabel(’u(x,t)’)
shading interp

Método de diferencias finitas para la ecuacion de onda


function U = onda (f,g,a,b,c,n,m)
%’sin(pi*x)+sin(2*pi*x)’,’0’,1,0.5,2,11,21
%Datos
% - f=u(x,0) se entra como una cadena de carcteres.
% - g=ut(x,0) se ingresa como una cadena de caracteres.
% - a y b son los extremos superiores de los intervalos [0,a] y [0,b]
% - c es la constante de la ecuacion de onda.
% - n y m es el numero de nodos en [0,a] y [0,b]
%Resultado
% - U es la matriz con los respectivos resultados.
format long g;
close all;
h=a/(n-1);
k=b/(m-1);
alfa=c*k/h;
alfa2=alfa^2;
alfa22=(alfa2)/2;
s1=1-alfa2;
s2=2*s1;
U=zeros(n,m);
%se calculan las primeras filas (j-esimo y (j-1)-esimo paso)
for i=2:n-1
x=h*(i-1);
U(i,1)=eval(f); %f esta en funcion de x
x=h*i;
evaluar1=eval(f);
x=h*(i-2);
evaluar2=eval(f);
x=h*(i-1);
U(i,2)=s1*eval(f)+k*eval(g)+alfa22*(evaluar1+evaluar2);
end
%Calculos de las otras filas
for j=3:m
for i=2:(n-1)
U(i,j)=s2*U(i,j-1)+alfa2*(U(i-1,j-1)+U(i+1,j-1))-U(i,j-2);
end

23
end
U=U’;
figure(2),surf(U),title(’Grafica de U=f(x,t)’),xlabel(’x’),ylabel(’t’),zlabel(’u’)

24

También podría gustarte