Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ramirez Vanegas Villegas Mtodo Difer PDF
Ramirez Vanegas Villegas Mtodo Difer PDF
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.
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.
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
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
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
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
∂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
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].
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 λ.
7
Al método generado por esta aproximación se le llama método de Crank-
Nicolson y esta representado de forma matricial como
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.
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
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
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
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
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
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.
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
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
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
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.
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
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
23
end
U=U’;
figure(2),surf(U),title(’Grafica de U=f(x,t)’),xlabel(’x’),ylabel(’t’),zlabel(’u’)
24