Академический Документы
Профессиональный Документы
Культура Документы
ONDAS BIDIMENSIONAL
Métodos Matemáticos II
3º Ingeniería Aeronáutica
Curso 2007/2008
∂ 2u 2⎛∂ u ∂ 2u ⎞
2
= c ⎜ + ⎟ [1]
∂t 2 ⎝ ∂x
2
∂y 2 ⎠
Vamos a considerar esta ecuación en el rectángulo [ −0.5, 0.5] × [ −0.5, 0.5] , con una
condición inicial dada por:
u ( x, y, 0 ) = 0 si r > 0.25
∂u
( x, y,0 ) = 0
∂t
Comparad la solución en t = 100 . Para ello, haced una representación gráfica en todo el
rectángulo y de la solución obtenida en la recta y = x, − 0.5 ≤ x ≤ 0.5 .
2
2 Método Explícito
En el método explícito se obtiene una solución que depende de las soluciones
anteriores. La discretización temporal y espacial para este método en diferencias finitas
tiene la siguiente forma:
n −1 n +1
∂ 2u ui , j − 2ui , j + ui , j
n
=
∂t 2 Δt 2
=
∂x 2 Δx 2
∂ 2u ui , j −1 − 2ui , j + ui , j +1
n n n
=
∂y 2 Δy 2
⎛ 2 ⎛ Δt
2
Δt 2 ⎞ ⎞ ⎛ c 2 Δt 2 ⎞ ⎛ c 2 Δt 2 ⎞ n −1
u n +1
= ui , j ⎜ − c ⎜ 2 + 2 ⎟ ⎟ + ( ui −1, j + ui +1, j ) ⎜
2 n
1 n n
2 ⎟ ( i , j −1
+ u + ui , j +1 ) ⎜
n n
2 ⎟
− ui , j
⎝ Δx Δy ⎠ ⎠ ⎝ Δx ⎠ ⎝ Δy ⎠
i,j
⎝
3
Δt 2 2 Δt
2
Si definimos r = c 2 y s = c y tenemos en cuenta que nuestro mallado es
Δx 2 Δy 2
regular y uniforme ( Δx = Δy ), obtenemos que r = s , por lo que nuestra ecuación a
resolver queda de la siguiente manera:
Los valores para n = 0 se obtienen de la condición inicial, pero también son necesarios
los valores para n = 1 . Si usamos la condición de la velocidad:
∂u ui1, j − ui0, j
( x, y,0 ) = 0 → ui1, j = ui0, j
∂t Δt
U n +1 = KU n − U n −1 [3]
Como se puede observar, se cumple la ecuación [2], por lo que las matrices son
correctas.
5
Método Crank-Nicolson (CNS)
El método de Crank Nicolson utiliza también un esquema en diferencias finitas. Al
contrario que el esquema explícito, éste no tiene problemas de estabilidad. La
discretización temporal y espacial es la siguiente:
n −1 n +1
∂ 2u ui , j − 2ui , j + ui , j
n
=
∂t 2 Δt 2
n +1 n +1 n +1
∂ 2u ui −1, j − 2ui , j + ui +1, j ui −1, j − 2ui , j + ui +1, j
n n n
= +
∂x 2 Δx 2 Δx 2
n +1 n +1 n +1
∂ 2u ui , j −1 − 2ui , j + ui , j +1 ui , j −1 − 2ui , j + ui , j +1
n n n
= +
∂y 2 Δy 2 Δy 2
= ⎜⎜ + ⎟⎟ + ...
Δt 2 2 ⎜⎝ ⎜⎝ Δx 2 Δx 2 ⎠
uin,−j 1 − 2uin, j + uin,+j 1 ⎛ uin, j −1 − 2uin, j + uin, j +1 uin,+j −11 − 2uin,+j 1 + uin, +j +11 ⎞ ⎞
..... + ⎜ + ⎟⎟ ⎟⎟ ;
Δt 2 ⎜ Δy 2 Δy 2
⎝ ⎠⎠
6
c 2 Δt 2 n c 2 Δt 2 n +1
2 ( i −1, j i +1, j ) 2 ( i −1, j
uin,−j 1 − 2uin, j + uin, +j 1 = u − 2u n
+ u n
+ u − 2uin,+j 1 + uin++11, j ) + ...
2Δx 2Δx
i, j
c Δt
2 2
c 2 Δt 2 n +1
2 ( i , j −1
n −1
ui , j − 2ui , j ..... +
n
u − 2ui , j + ui , j +1 ) +
n n n
2 ( i , j −1
u − 2uin,+j 1 + uin,+j +11 ) ;
2Δy 2Δy
⎛ ⎛ Δt 2 Δt 2 ⎞ ⎞ ⎛ c 2 Δt 2 ⎞ n +1 ⎛ c Δt ⎞
2 2
...uin,+j 1 ⎜1 + c 2 ⎜ 2 + 2 ⎟ ⎟ − ( uin−+11, j + uin++11, j ) ⎜ 2 ⎟
− ( u n +1
i , j −1 + u i , j +1 ⎜ ) 2 ⎟
= ...
⎝ ⎝ Δx Δy ⎠ ⎠ ⎝ 2Δx ⎠ ⎝ 2Δy ⎠
⎛ ⎛ Δt 2 Δt 2 ⎞ ⎞ ⎛ c 2 Δt 2 ⎞ ⎛ c 2 Δt 2 ⎞ n −1
..... = 2uin, j ⎜1 − c 2 ⎜ 2 + 2 ⎟ ⎟ + ( uin−1, j + uin+1, j ) ⎜ 2 ⎟
+ ( u n
i , j −1 + u n
)
i , j +1 ⎜ 2 ⎟
− ui ;
⎝ ⎝ Δx Δy ⎠ ⎠ ⎝ 2Δx ⎠ ⎝ 2Δy ⎠
Δt 2 2 Δt
2
r = c2 ; s = c ; Δx = Δy → r = s
Δx 2 Δy 2
∂u u −u 1 0
AU n +1 = KU n − U n −1 [5]
U n +1 = A−1 ( KU n − U n −1 )
7
⎛ u1n,1+1 ⎞ ⎛ u1n,1 ⎞ ⎛ u1n,1−1 ⎞
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ # ⎟ ⎜ # ⎟ ⎜ # ⎟
⎜ n +1 ⎟ ⎜ n ⎟ ⎜ n −1 ⎟
⎜ u1,N y ⎟ ⎜ u1,N y ⎟ ⎜ u1,N y ⎟
⎜ n +1 ⎟ ⎜ n ⎟ ⎜ n −1 ⎟
⎜ u2 ,1 ⎟ ⎜ u2 ,1 ⎟ ⎜ u2 ,1 ⎟
⎜ # ⎟ ⎜ # ⎟ ⎜ # ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ u n +1 ⎟ ⎜ un ⎟ ⎜ u n −1 ⎟
⎜ 2 ,N y ⎟ ⎜ 2 ,N y ⎟ ⎜ 2 ,N y ⎟
⎜ # ⎟ ⎜ # ⎟ ⎜ # ⎟
U n +1 = ⎜ ⎟ Un =⎜ ⎟; U n −1 = ⎜ ⎟
⎜ # ⎟ ⎜ # ⎟ ⎜ # ⎟
⎜ n +1 ⎟ ⎜ n ⎟ ⎜ n −1 ⎟
⎜ u N x −1,1 ⎟ ⎜ u N x −1,1 ⎟ ⎜ u N x −1,1 ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ # ⎟ ⎜ # ⎟ ⎜ # ⎟
⎜ u n +1 ⎟ ⎜ un ⎟ ⎜ u n −1 ⎟
⎜ N x −1,Ny ⎟ ⎜ N x −1,Ny ⎟ ⎜ N x −1,Ny ⎟
⎜ u n +1 ⎟ ⎜ u n1 ⎟ ⎜ u n −1 ⎟
⎜ N x ,1 ⎟ ⎜ N x ,1 ⎟ ⎜ N x ,1 ⎟
⎜ # ⎟ ⎜ # ⎟ ⎜ # ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ u Nn +1,N ⎟ ⎜ u Nn ,N ⎟ ⎜ u Nn −1,N ⎟
⎝ x y ⎠ ⎝ x y ⎠ ⎝ x y ⎠
8
⎛ 2 − 4r r 2 0 0 r 2 0 " " " " " " 0⎞
⎜ ⎟
⎜ r 2 2 − 4r r 2 0 0 r 2 0 " " " " " 0⎟
⎜ 0 r 2 2 − 4r r 2 0 0 % 0 " " " " 0⎟
⎜ ⎟
⎜ 0 0 r 2 2 − 4r 0 0 % % 0 " " " 0⎟
⎜ r 2 0 0 0 2 − 4r r 2 % % % 0 " " 0 ⎟
⎜ ⎟
⎜ 0 r 2 0 0 r 2 2 − 4r % % % % 0 " 0 ⎟
K= ⎜ # % % % % % % % % % % % # ⎟
⎜ ⎟
⎜ 0 " 0 % % % % 2 − 4r r 2 0 0 r 0 ⎟
⎜ 0 " " 0 % % % r 2 2 − 4r 0 0 0 r ⎟⎟
⎜
⎜ 0 " " " 0 % % 0 0 2 − 4r r 2 0 0 ⎟
⎜ ⎟
⎜ 0 " " " " 0 % 0 0 r 2 2 − 4r r 2 0 ⎟
⎜ 0 " " " " " 0 r 2 0 0 r 2 2 − 4r r 2 ⎟
⎜ ⎟
⎝ 0 " " " " " " 0 r 2 0 0 r 2 2 − 4r ⎠
9
Como se puede observar, se cumple la ecuación [4], por lo que las matrices son
correctas.
10
3 Programación en MATLAB®
A continuación, explicaremos los pasos que se han seguido para implementar los
métodos explícito y Crank-Nicolson en el programa MATLAB®. Para el método
explícito se ha optado por programarlo de dos formas distintas: iterativa y matricial. El
método de Crank-Nicolson sólo se ha implementado matricialmente.
clear all
clc
path(path,cd);
c=1;
T=150;
tf=100;
r=(c*dt/dx)^2;
%Condiciones Iniciales
for i=1:Nx
for j=1:Ny
rr(i,j)=sqrt(x(i)^2+y(j)^2);
if rr(i,j)>0.25
U0(i,j)=0;
else
U0(i,j)=2*cos(2*pi*rr(i,j));
end
end
end
%Condición de la velocidad
Up0=0*U0;
11
A continuación, presentamos el algoritmo que se ha usado para resolver el problema con
el método explícito de forma iterativa:
metodo='explícito (iterativo)';
U0expl=U0; U1expl=U1;
tic
if i==1
if j==1
U{n}(i,j)=2*(1-
2*r)*U1expl(i,j)+r*(U1expl(i+1,j)+U1expl(i,j+1))-U0expl(i,j);
elseif j==Nx
U{n}(i,j)=2*(1-
2*r)*U1expl(i,j)+r*(U1expl(i+1,j)+U1expl(i,j-1))-U0expl(i,j);
else
U{n}(i,j)=2*(1-
2*r)*U1expl(i,j)+r*(U1expl(i+1,j)+U1expl(i,j-1)+U1expl(i,j+1))-
U0expl(i,j);
end
elseif j==1
if i==Nx
U{n}(i,j)=2*(1-2*r)*U1expl(i,j)+r*(U1expl(i-
1,j)+U1expl(i,j+1))-U0expl(i,j);
else
U{n}(i,j)=2*(1-2*r)*U1expl(i,j)+r*(U1expl(i-
1,j)+U1expl(i+1,j)+U1expl(i,j+1))-U0expl(i,j);
end
elseif i==Nx
if j==Ny
U{n}(i,j)=2*(1-2*r)*U1expl(i,j)+r*(U1expl(i-
1,j)+U1expl(i,j-1))-U0expl(i,j);
else
U{n}(i,j)=2*(1-2*r)*U1expl(i,j)+r*(U1expl(i-
1,j)+U1expl(i,j-1)+U1expl(i,j+1))-U0expl(i,j);
end
elseif j==Ny
U{n}(i,j)=2*(1-2*r)*U1expl(i,j)+r*(U1expl(i-
1,j)+U1expl(i+1,j)+U1expl(i,j-1))-U0expl(i,j);
else
U{n}(i,j)=2*(1-2*r)*U1expl(i,j)+r*(U1expl(i-
1,j)+U1expl(i+1,j)+U1expl(i,j-1)+U1expl(i,j+1))-U0expl(i,j);
12
end
end
end
U0expl = U1expl; U1expl = U{n};
end
tcalc(1)=toc;
size=whos('U');
size=size.bytes; size=size/(1024)^2;
El motivo de por qué se han tenido que usar tantas sentencias de tipo if es porque hay
que tener especial cuidado con los valores de la frontera. Cada solución en cada instante
de tiempo es almacenada en un cell array.
metodo='explícito (matricial)';
tic
E=ones(Nx^2,1);
ceros=zeros(Nx^2,Nx-2);
r1=r*E;
r2=r1; r2(Nx:Nx:Nx^2,1)=0; r3=flipud(r2);
tcalc(2)=toc;
mb=whos('U');
mb=mb.bytes; mb=mb/(1024)^2;
%% Método Crank-Nicolson
metodo='Crank-Nicolson';
tic
E=ones(Nx^2,1);
ceros=zeros(Nx^2,Nx-2);
r1=r/2*E;
r2=r1; r2(Nx:Nx:Nx^2,1)=0; r3=flipud(r2);
U0t=U0'; U1t=U1';
U0vect=U0t(:); U1vect=U1t(:);
tcalc(3)=toc;
mb=whos('U');
mb=mb.bytes; mb=mb/(1024)^2;
Con el fin de poder dibujar la evolución del sistema se han elaborado vídeos. Estos
videos se han montado fotograma a fotograma:
%% Obtener Fotogramas
for i=1:60/dt
surf(x,y,U{i});
title({['Método ',metodo,' :: Distribución de U para
t=',num2str(i*dt),' segundos'];['\Deltat=',num2str(dt),' ::
\Deltax=\Deltay=',num2str(dx)]});
xlabel(['X (\Deltax=',num2str(dx),')']); ylabel(['Y
(\Deltay=',num2str(dy),')']); zlabel('U');
axis([mx Mx my My -2 2]);
name=['imagen_',num2str(i)];
print('-dpng','-r100',name)
end
14
4 Resultados
Se ha elegido un paso temporal de 0.02 segundos y un paso temporal de 0.04 metros.
Por lo tanto, se cumple la condición de estabilidad para el método explícito.
surf(x,y,Uexplit)
title({['Método explícito (iterativo) :: Distribución de U para
t=',num2str(tf),' segundos'];['\Deltat=',num2str(dt),' ::
\Deltax=\Deltay=',num2str(dx)]});
xlabel(['X (\Deltax=',num2str(dx),')']); ylabel(['Y
(\Deltay=',num2str(dy),')']); zlabel('U');
axis([mx Mx my My -2 2]);
print('-dpng','-r100','ondas2D_explicito_iterativo_U_3D_t100')
pause
plot(x,diag(Uexplit))
title({['Método explícito (iterativo) :: Distribución de U para
t=',num2str(tf),' segundos en la recta y=x'];['\Deltat=',num2str(dt),'
:: \Deltax=\Deltay=',num2str(dx)]});
print('-dpng','-r100','ondas2D_explicito_iterativo_U_2D_y=x_t100')
surf(x,y,Uexplmat)
title({['Método explícito (matricial) :: Distribución de U para
t=',num2str(tf),' segundos'];['\Deltat=',num2str(dt),' ::
\Deltax=\Deltay=',num2str(dx)]});
xlabel(['X (\Deltax=',num2str(dx),')']); ylabel(['Y
(\Deltay=',num2str(dy),')']); zlabel('U');
axis([mx Mx my My -2 2]);
print('-dpng','-r100','ondas2D_explicito_matricial_U_3D_t100')
pause
plot(x,diag(Uexplmat))
title({['Método explícito (matricial) :: Distribución de U para
t=',num2str(tf),' segundos en la recta y=x'];['\Deltat=',num2str(dt),'
:: \Deltax=\Deltay=',num2str(dx)]});
print('-dpng','-r100','ondas2D_explicito_matricial_U_2D_y=x_t100')
%% Ejercicio Crank-Nicolson
surf(x,y,Ucrank);
title({['Método Crank-Nicolson :: Distribución de U para
t=',num2str(tf),' segundos'];['\Deltat=',num2str(dt),' ::
\Deltax=\Deltay=',num2str(dx)]});
xlabel(['X (\Deltax=',num2str(dx),')']); ylabel(['Y
(\Deltay=',num2str(dy),')']); zlabel('U');
axis([mx Mx my My -2 2]);
print('-dpng','-r100','ondas2D_crank-nicolson_U_3D_t100')
pause
plot(x,diag(Ucrank));
title({['Método Crank-Nicolson :: Distribución de U para
t=',num2str(tf),' segundos en la recta y=x'];['\Deltat=',num2str(dt),'
:: \Deltax=\Deltay=',num2str(dx)]});
print('-dpng','-r100','ondas2D_crank-nicolson_U_2D_y=x_t100')
15
Además de las gráficas que a continuación se adjuntan, se han elaborado vídeos de un
minuto en los que se muestran la evolución temporal del sistema para cada uno de los
métodos. A continuación se muestran las gráficas para los instantes de tiempo 2, 5, 10,
20, 50 y 100 segundos de cada uno de los métodos. Se muestra tanto la distribución de
U en todo el rectángulo como en la recta y = x :
Para t=2 s:
16
Para t=5 s:
17
Para t=10 s:
18
Para t=20 s:
19
Para t=50 s:
20
Para t=100 s:
21