Está en la página 1de 17

SIMULACIÓN DE ONDAS EN DOMINIOS INFINITOS TRUNCADOS

APROXIMACIÓN MEDIANTE DIFERENCIAS FINITAS EN MATLAB ®

Asignatura: Métodos Numéricos, Modelización y Sistemas Dinámicos


Profesora: Ana Carpio Rodríguez
Autor: Alfonso de la Fuente Ruiz
Fecha: Septiembre de 2009
INTRODUCCIÓN
Este trabajo se presenta para optar a la superación parcial de la asignatura “Métodos
Numéricos, Modelización y Sistemas Dinámicos” (en adelante: “MNMSD”) del Master Oficial
de Postgrado en Ingeniería Matemática de la Universidad Complutense de Madrid.

Su contenido constituye una extensión a


dos dimensiones más el tiempo,
discretizando por el “Método numérico
de las Líneas” (Numeric MOL: ‘Method
Of Lines’ *6 pág. 184+) de una
simulación de ondas en dominios
infinitos truncados con forma cuadrada.
Puede interpretarse físicamente como
la oscilación de una membrana.

Los resultados espaciotemporales se aproximan por un esquema explícito de segundo orden


basado en diferencias finitas (FDTD) para dos juegos de condiciones de contorno diferentes.
En tercer lugar se aproxima la solución en un recinto mayor también cuadrado, con el triple
de lado.

Los programas se han implementado sobre MATLAB R2006a (v7.2.0.232) y los vídeos se
exportaron en un Pentium IV sobre una máquina virtual (VirtualBox) que ejecutaba Windows
XP SP2 con 384 MB RAM. Se incluye una bibliografía de referencias consultadas.

MIM-UCM Página 2
ENUNCIADO Y NOTAS

MIM-UCM Página 3
NOTAS DE LA VERSIÓN:

Se utiliza como base el algoritmo ya implementado para la ecuación de ondas en una


dimensión (ming7c.pdf)

𝑗 +1
Se desarrolla la ecuación por diferencias finitas hasta despejar el término 𝑢𝑖,𝑙 .

Para simular dos juegos de condiciones de contorno, seguidamente se despejan también las
𝑗 +1 𝑗 +1 𝑗 +1 𝑗 +1
condiciones de contorno no nulas: 𝑢𝑁,𝑙 , 𝑢0,𝑙 , 𝑢𝑖,𝑁 , 𝑢𝑖,0 .

A continuación se inicializan las condiciones de partida.

Finalmente se introduce una rutina que permite exportar el vídeo generado a un fichero en
formato MPEG. Para ello se emplea el ‘plug-in’ “MPGwrite 6.0” de MATLAB, que debe
descomprimirse en la misma carpeta que contenga el fichero principal. Dicho plugin puede
descargarse gratuitamente de la siguiente dirección:

http://www.mathworks.com/matlabcentral/fileexchange/309

A partir del código fuente desarrollado para la primera aproximación, se obtiene el de las
simulaciones segunda y tercera, mediante una serie de extensiones y modificaciones.

A continuación se presentan algunos cálculos intermedios y diagramas realizados:

MIM-UCM Página 4
MIM-UCM Página 5
MIM-UCM Página 6
CÓDIGO FUENTE
PRIMERA APROXIMACIÓN, CONDICIONES DE CONTORNO NULAS
%UCM-MIM 2009 MNMSD:ANA CARPIO
%AUTOR:ALFONSO DE LA FUENTE RUIZ
%function [U_save,x,y,t_save]= ondas2D(c,t_f,M,tsteps);
%Resuelve utt - c2 (uxx +uyy) = 0 mediante un esquema explicito de segundo orden
%Primera aproximación. Contorno nulo.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Parámetros y datos de entrada:
Nframes=180; % % Nº de cuadros de vídeo totales
Nframes=input('Introduzca el Nº de fotogramas (Def.=180): ');
NFramesPorIt=3; % Nº cuadros de vídeo por cada iteración dibujada
c=1; % coeficiente c de la ecuacion (Velocidad de la onda)
c=input('Introduzca el valor de c, velocidad de onda (Def.=1): ');
t_f=6; % Tiempo final hasta el que calculamos la solución
t_f=input('Introduzca el instante final de tiempo (Def.=6): ');
M=12; %% N=length(x)=lenght(y) % Nº de partes para discretizar cada intervalo [-L,L]
M=input('Introduzca el Nº de divisiones de la rejilla (Def.=12): ');
ResX=640; ResY=240;
ResX=input('Introduzca la resolución de vídeo en el eje X (Def.=640): ');
ResY=input('Introduzca la resolución de vídeo en el eje Y (Def.=240): ');
'Inicializando primera aproximación'
L=1; % Semieje de intervalo cuadrado [-1,1]
h=2*L/M; % dx=dy Longitud de paso espacial
tsteps=360; %% Nº de partes iguales en que se descompone [0,t_f]
k=c/(4*h^2); %% Paso espacial
dt=t_f/tsteps; % Paso temporal
tiempos=0:dt:t_f; % Mallado espacio-temporal
% Recinto pequeño:
x=-L:h:L;
y=-L:h:L;
[X,Y]=meshgrid(x,y);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%Condiciones iniciales:
U0=exp(-10*(X.^2+Y.^2)); %% u0 % Posición inicial
U1=zeros(size(X)); % Velocidad inicial
%Condiciones iniciales, sin contornos:
U0_red=U0(2:M,2:M); % Posición sin contorno
U1_red=U1(2:M,2:M); % Velocidad sin contorno
%Versiones aplanadas:
u0=reshape(U0_red,(M-1)^2,1);
u1=reshape(U1_red,(M-1)^2,1);
%Utilizamos la matriz U para trabajar cómodamente con el primer índice
%para la coordenada ’x’ y el segundo para la coordenada ’y’
U=zeros(M+1,M+1);
U_save=zeros(M+1,M+1,Nframes);
t_save=zeros(Nframes,1); % Vector de cuadros de animación
cuentaframe=1; %%
marca=floor(tsteps/(Nframes-1)); %% Para saber qué iteración almacenar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Condiciones de frontera:
U_save(1,:,:)=zeros(1,M+1,Nframes); % Lado izquierdo
U_save(M+1,:,:)=zeros(1,M+1,Nframes); % Lado derecho
U_save(:,1,:)=zeros(M+1,1,Nframes); % Lado inferior
U_save(:,M+1,:)=zeros(M+1,1,Nframes); % Lado superior
U_save(:,:,1)=U0; % Posición inicial

MIM-UCM Página 7
t_save(1)=0; % Cuadro inicial de animación
% OPERADOR D: Usamos el comando diag(vector,k) para crear la matriz tridiagonal
% El comando kron se usa para poner unos en los pares de índices:
Tridiag = diag(-4*ones((M-1)^2,1))+...
kron(eye(M-1),diag(ones(M-2,1),1))+...
kron(eye(M-1),diag(ones(M-2,1),-1))+...
kron(diag(ones(M-2,1),1),eye(M-1))+...
kron(diag(ones(M-2,1),-1),eye(M-1));
D=(1/h^2)*Tridiag; % Crear el operador discretizado %
u_ant=u0; % Inicializar paso anterior
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u = u0 + dt*u1 + 0.5*(dt^2)*(c^2)*D*u0; % Cálculo del paso 2
%u(i,l,j+1)=2*u(i,l,j)-u(i,l,j-1)+(c^2*k^2/h^2)*(u(i+1,l,j)+u(i-1,l,j)+u(i,l+1,j)+u(i,l-
1,j)-4*u(i,l,j));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Calculando. Espere, por favor...'
% ITERAR para el resto de pasos temporales:
for n=1:tsteps
temp=u;
u = 2*u - u_ant + (dt^2)*(c^2)*D*u;
u_ant=temp;
if mod(n,marca)==0 % Guardamos los valores de u sólo para algunos tiempos:
indice = 1 + n/marca;
U(2:M,2:M)=reshape(u,M-1,M-1);
U_save(:,:,indice)=U;
t_save(indice)=tiempos(n);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Cálculo completo. Creando visualización...'
% Representación:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parámetros de visualización:
camlight(camlight('right'),'right'); %view(0,90); % Angulo de visualización
shading interp; lighting phong; colormap copper; axis off; zlim([-1 1]);
colorbar;
set(gca,'NextPlot','replacechildren');
set(gcf, 'Renderer', 'ZBuffer');
set(gcf,'MenuBar','none'); % Quitar la barra de menú
set(gcf,'Position',[20 40 ResX ResY]);% Situar la figura a 20*40 píxeles con tamaño
ResX*ResY:
P1=moviein(NFramesPorIt*indice); % Crear película 1
[X,Y]=meshgrid(x,y);
for i=1:indice
surf(U_save(:,:,i))
set(gcf,'Color', [0 0 0], 'Number', 'off', 'Name', sprintf('Onda2D: N=%i, T=%.2f
msec',i-1,t_save(i)*1e3));
for nf=1:NFramesPorIt % Guardar 'NFramesPorIt' cuadros en el vídeo:
P1((i-1)*NFramesPorIt+nf)=getframe(gcf);
end
%pause(.1);
end
'Animación completa. Exportando vídeo...'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
save onda2D_P1.mat P1; % Guardar la animación MATLAB a un archivo
mpgwrite(P1,jet,'onda2D_P1.mpg'); % Convertir la animación en vídeo MPEG
'Programa completo. Que tenga un buen día :)'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

MIM-UCM Página 8
SEGUNDA APROXIMACIÓN, CONDICIONES DE CONTORNO ESPECIALES

Nota: para evitar colisiones entre asignaciones a contornos


horizontales y verticales, las esquinas (2*2) del contorno se
igualarán a 0 en cada iteración, en las tres celdillas accesibles
(marcadas en rojo sobre la figura).

%UCM-MIM 2009 MNMSD:ANA CARPIO


%AUTOR:ALFONSO DE LA FUENTE RUIZ
%function [U_save,x,y,t_save]= ondas2D(c,t_f,M,tsteps);
%Resuelve utt - c2 (uxx +uyy) = 0 mediante un esquema explicito de segundo orden
%Segunda aproximación. Contorno especial.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Parámetros y datos de entrada:
Nframes=120; % % Nº de cuadros de vídeo totales
Nframes=input('Introduzca el Nº de fotogramas (Def.=120): ');
NFramesPorIt=3; % Nº cuadros de vídeo por cada iteración dibujada
c=1; % coeficiente c de la ecuacion (Velocidad de la onda)
c=input('Introduzca el valor de c, velocidad de onda (Def.=1): ');
t_f=6; % Tiempo final hasta el que calculamos la solución
t_f=input('Introduzca el instante final de tiempo (Def.=6): ');
M=11; %% N=length(x)=lenght(y) % Nº de partes para discretizar cada intervalo [-L,L]
M=input('Introduzca el Nº de divisiones de la rejilla (Def.=11): ');
ResX=640; ResY=240;
ResX=input('Introduzca la resolución de vídeo en el eje X (Def.=640): ');
ResY=input('Introduzca la resolución de vídeo en el eje Y (Def.=240): ');
'Inicializando segunda aproximación'
L=1; % Semieje de intervalo cuadrado [-1,1]
h=2*L/M; % dx=dy Longitud de paso espacial
tsteps=360; %% Nº de partes iguales en que se descompone [0,t_f]
k=c/(4*h^2); %% Paso espacial
dt=t_f/tsteps; % Paso temporal
tiempos=0:dt:t_f; % Mallado espacio-temporal
% Recinto pequeño:
x=-L:h:L;
y=-L:h:L;
[X,Y]=meshgrid(x,y);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%Condiciones iniciales:
U0=exp(-10*(X.^2+Y.^2)); %% u0 % Posición inicial
U1=zeros(size(X)); % Velocidad inicial
%Condiciones iniciales, sin contornos:
U0_red=U0(2:M,2:M); % Posición sin contorno
U1_red=U1(2:M,2:M); % Velocidad sin contorno
%Versiones aplanadas:
u0=reshape(U0_red,(M-1)^2,1);
u1=reshape(U1_red,(M-1)^2,1);
%Utilizamos la matriz U para trabajar cómodamente con el primer índice
%para la coordenada ’x’ y el segundo para la coordenada ’y’
U=zeros(M+1,M+1);
U_save=zeros(M+1,M+1,Nframes);
t_save=zeros(Nframes,1); % Vector de cuadros de animación
cuentaframe=1; %%
marca=floor(tsteps/(Nframes-1)); %% Para saber qué iteración almacenar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

MIM-UCM Página 9
% Condiciones de frontera:
U0_izq=zeros(1,M+1,Nframes); % Lado izquierdo
U0_dch=zeros(1,M+1,Nframes); % Lado derecho
U0_inf=zeros(M+1,1,Nframes); % Lado inferior
U0_sup=zeros(M+1,1,Nframes); % Lado superior
% Inicialización de frontera:
U0int_izq=U0(2,2:M);% Lado izquierdo interior
U0int_dch=U0(M,2:M);% Lado derecho interior
U0int_inf=U0(2:M,2);% Lado inferior interior
U0int_sup=U0(2:M,M);% Lado superior interior
for i=3:abs(M+1-2)
U1_izq(i)=U0_izq(i)+c*k/h*(U0int_izq(i-1)-U0_izq(i));
end
for i=3:abs(M+1-2)
U1_dch(i)=U0_dch(i)-c*k/h*(U0_dch(i)-U0int_dch(i-1));
end
for i=3:abs(M+1-2)
U1_sup(i)=U0_sup(i)-c*k/h*(U0_sup(i)-U0int_sup(i-1));
end
for i=3:abs(M+1-2)
U1_inf(i)=U0_inf(i)+c*k/h*(U0int_inf(i-1)-U0_inf(i));
end
%4 esquinas 2*2-1 nulas (decisión de diseño)
U1_izq(2)=0; U1_izq(1)=0;
U1_dch(2)=0; U1_dch(1)=0;
U1_sup(1)=0; U1_sup(2)=0;
U1_inf(1)=0; U1_inf(2)=0;
U1_izq(M)=0; U1_izq(M+1)=0;
U1_dch(M)=0; U1_dch(M+1)=0;
U1_sup(M)=0; U1_sup(M+1)=0;
U1_inf(M)=0; U1_inf(M+1)=0; % 4 redund.
%Inicialización
U_save(1,:,:)=U0_izq;
U_save(M+1,:,:)=U0_dch;
U_save(:,1,:)=U0_inf;
U_save(:,M+1,:)=U0_sup;
%
U_save(:,:,1)=U0; % Posición inicial
t_save(1)=0; % Cuadro inicial de animación
% OPERADOR D: Usamos el comando diag(vector,k) para crear la matriz tridiagonal
% El comando kron se usa para poner unos en los pares de índices:
Tridiag = diag(-4*ones((M-1)^2,1))+...
kron(eye(M-1),diag(ones(M-2,1),1))+...
kron(eye(M-1),diag(ones(M-2,1),-1))+...
kron(diag(ones(M-2,1),1),eye(M-1))+...
kron(diag(ones(M-2,1),-1),eye(M-1));
D=(1/h^2)*Tridiag; % Crear el operador discretizado %
u_ant=u0; % Inicializar paso anterior
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u = u0 + dt*u1 + 0.5*(dt^2)*(c^2)*D*u0; % Cálculo del paso 2
%u(i,l,j+1)=2*u(i,l,j)-u(i,l,j-1)+(c^2*k^2/h^2)*(u(i+1,l,j)+u(i-1,l,j)+u(i,l+1,j)+u(i,l-
1,j)-4*u(i,l,j));
% Inicialización de nueva frontera ++
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Calculando. Espere, por favor...'
% ITERAR para el resto de pasos temporales:
for n=1:tsteps
temp=u;
u = 2*u - u_ant + (dt^2)*(c^2)*D*u;
u_ant=temp;
%calcular nuevos contornos ++
if mod(n,marca)==0 % Guardamos los valores de u sólo para algunos tiempos:
indice = 1 + n/marca;
U(2:M,2:M)=reshape(u,M-1,M-1);
%asignar nuevos contornos ++

MIM-UCM Página 10
U_save(:,:,indice)=U;
t_save(indice)=tiempos(n);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Cálculo completo. Creando visualización...'
% Representación:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parámetros de visualización:
camlight(camlight('right'),'right'); %view(0,90); % Angulo de visualización
shading interp; lighting phong; colormap copper; axis off; zlim([-1 1]);
colorbar;
set(gca,'NextPlot','replacechildren');
set(gcf, 'Renderer', 'ZBuffer');
set(gcf,'MenuBar','none'); % Quitar la barra de menú
set(gcf,'Position',[20 40 ResX ResY]);% Situar la figura a 20*40 píxeles con tamaño
ResX*ResY:
P2=moviein(NFramesPorIt*indice); % Crear película 1
[X,Y]=meshgrid(x,y);
for i=1:indice
surf(U_save(:,:,i))
set(gcf,'Color', [0 0 0], 'Number', 'off', 'Name', sprintf('Onda2D: N=%i, T=%.2f
msec',i-1,t_save(i)*1e3));
for nf=1:NFramesPorIt % Guardar 'NFramesPorIt' cuadros en el vídeo:
P2((i-1)*NFramesPorIt+nf)=getframe(gcf);
end
%pause(.1);
end
'Animación completa. Exportando vídeo...'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
save onda2D_P2.mat P2; % Guardar la animación MATLAB a un archivo
mpgwrite(P2,jet,'onda2D_P2.mpg'); % Convertir la animación en vídeo MPEG
'Programa terminado. Que tenga un buen día :)'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

MIM-UCM Página 11
TERCERA APROXIMACIÓN, RECINTO MAYOR
%UCM-MIM 2009 MNMSD:ANA CARPIO
%AUTOR:ALFONSO DE LA FUENTE RUIZ
%function [U_save,x,y,t_save]= ondas2D(c,t_f,M,tsteps);
%Resuelve utt - c2 (uxx +uyy) = 0 mediante un esquema explicito de segundo orden
%Tercera aproximación. Contorno nulo.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Parámetros y datos de entrada:
Nframes=180; % % Nº de cuadros de vídeo totales
Nframes=input('Introduzca el Nº de fotogramas (Def.=180): ');
NFramesPorIt=3; % Nº cuadros de vídeo por cada iteración dibujada
c=1; % coeficiente c de la ecuacion (Velocidad de la onda)
c=input('Introduzca el valor de c, velocidad de onda (Def.=1): ');
t_f=4; % Tiempo final hasta el que calculamos la solución
t_f=input('Introduzca el instante final de tiempo (Def.=4): ');
M=36; %% N=length(x)=lenght(y) % Nº de partes para discretizar cada intervalo [-3*L,3*L]
M=input('Introduzca el Nº de divisiones de la rejilla (Def.=36): ');
ResX=640; ResY=240;
ResX=input('Introduzca la resolución de vídeo en el eje X (Def.=640): ');
ResY=input('Introduzca la resolución de vídeo en el eje Y (Def.=240): ');
'Inicializando primera aproximación'
L=3; % Semieje de intervalo cuadrado [-3,3]
h=2*L/M; % dx=dy Longitud de paso espacial
tsteps=360; %% Nº de partes iguales en que se descompone [0,t_f]
k=c/(4*h^2); %% Paso espacial
dt=t_f/tsteps; % Paso temporal
tiempos=0:dt:t_f; % Mallado espacio-temporal
% Recinto pequeño:
x=-L:h:L;
y=-L:h:L;
[X,Y]=meshgrid(x,y);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%Condiciones iniciales:
U0=exp(-10*(X.^2+Y.^2)); %% u0 % Posición inicial
U1=zeros(size(X)); % Velocidad inicial
%Condiciones iniciales, sin contornos:
U0_red=U0(2:M,2:M); % Posición sin contorno
U1_red=U1(2:M,2:M); % Velocidad sin contorno
%Versiones aplanadas:
u0=reshape(U0_red,(M-1)^2,1);
u1=reshape(U1_red,(M-1)^2,1);
%Utilizamos la matriz U para trabajar cómodamente con el primer índice
%para la coordenada ’x’ y el segundo para la coordenada ’y’
U=zeros(M+1,M+1);
U_save=zeros(M+1,M+1,Nframes);
t_save=zeros(Nframes,1); % Vector de cuadros de animación
cuentaframe=1; %%
marca=floor(tsteps/(Nframes-1)); %% Para saber qué iteración almacenar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Condiciones de frontera:
U_save(1,:,:)=zeros(1,M+1,Nframes); % Lado izquierdo
U_save(M+1,:,:)=zeros(1,M+1,Nframes); % Lado derecho
U_save(:,1,:)=zeros(M+1,1,Nframes); % Lado inferior
U_save(:,M+1,:)=zeros(M+1,1,Nframes); % Lado superior
U_save(:,:,1)=U0; % Posición inicial
t_save(1)=0; % Cuadro inicial de animación
% OPERADOR D: Usamos el comando diag(vector,k) para crear la matriz tridiagonal
% El comando kron se usa para poner unos en los pares de índices:
Tridiag = diag(-4*ones((M-1)^2,1))+...
kron(eye(M-1),diag(ones(M-2,1),1))+...
kron(eye(M-1),diag(ones(M-2,1),-1))+...

MIM-UCM Página 12
kron(diag(ones(M-2,1),1),eye(M-1))+...
kron(diag(ones(M-2,1),-1),eye(M-1));
D=(1/h^2)*Tridiag; % Crear el operador discretizado %
u_ant=u0; % Inicializar paso anterior
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
u = u0 + dt*u1 + 0.5*(dt^2)*(c^2)*D*u0; % Cálculo del paso 2
%u(i,l,j+1)=2*u(i,l,j)-u(i,l,j-1)+(c^2*k^2/h^2)*(u(i+1,l,j)+u(i-1,l,j)+u(i,l+1,j)+u(i,l-
1,j)-4*u(i,l,j));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Calculando. Espere, por favor...'
% ITERAR para el resto de pasos temporales:
for n=1:tsteps
temp=u;
u = 2*u - u_ant + (dt^2)*(c^2)*D*u;
u_ant=temp;
if mod(n,marca)==0 % Guardamos los valores de u sólo para algunos tiempos:
indice = 1 + n/marca;
U(2:M,2:M)=reshape(u,M-1,M-1);
U_save(:,:,indice)=U;
t_save(indice)=tiempos(n);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'Cálculo completo. Creando visualización...'
% Representación:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Parámetros de visualización:
camlight(camlight('right'),'right'); %view(0,90); % Angulo de visualización
shading interp; lighting phong; colormap copper; axis off; zlim([-1 1]);
colorbar;
set(gca,'NextPlot','replacechildren');
set(gcf, 'Renderer', 'ZBuffer');
set(gcf,'MenuBar','none'); % Quitar la barra de menú
set(gcf,'Position',[20 40 ResX ResY]);% Situar la figura a 20*40 píxeles con tamaño
ResX*ResY:
P3=moviein(NFramesPorIt*indice); % Crear película 3
[X,Y]=meshgrid(x,y);
for i=1:indice
surf(U_save(:,:,i))
set(gcf,'Color', [0 0 0], 'Number', 'off', 'Name', sprintf('Onda2D: N=%i, T=%.2f
msec',i-1,t_save(i)*1e3));
for nf=1:NFramesPorIt % Guardar 'NFramesPorIt' cuadros en el vídeo:
P3((i-1)*NFramesPorIt+nf)=getframe(gcf);
end
%pause(.1);
end
'Animación completa. Exportando vídeo...'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
save onda2D_P3.mat P3; % Guardar la animación MATLAB a un archivo
mpgwrite(P3,jet,'onda2D_P3.mpg'); % Convertir la animación en vídeo MPEG
'Programa completo. Que tenga un buen día :)'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

MIM-UCM Página 13
RESULTADOS
Se presentan a continuación los resultados de ejecución de los programas. Se permite elegir
los parámetros por interpelación interactiva vía consola. Las animaciones se exportan a
ficheros en formato estándar MPEG y vídeo MATLAB en el mismo directorio. Para exportar los
vídeos es necesario instalar el ‘plug-in’ “MPGwrite 6.0” ya mencionado.

El vídeo resultante para la primera aproximación, con condiciones de


contorno nulas, puede reproducirse en la siguiente dirección del portal de
vídeo en internet YouTube: http://www.youtube.com/watch?v=J6UkK-
mmAq0

MIM-UCM Página 14
Se muestra el primer fotograma de la
ejecución de la segunda aproximación,
inicializada con condiciones de contorno
especiales.

Como ya se ha indicado, se tomó la decisión de


diseño de anular las celdillas de las cuatro
esquinas, a falta de indicaciones a este
respecto en el enunciado. Junto con el código
fuente se incluyen también algunos cálculos
intermedios realizados a mano para deducir las
condiciones de contorno y traducirlas a código
MATLAB.

El vídeo resultante para la tercera aproximación, con condiciones de contorno


nulas sobre un recinto con el triple de lado, puede reproducirse en la siguiente
dirección del portal de vídeo en internet YouTube:

http://www.youtube.com/watch?v=o4s_thweckM

Dependiendo de las condiciones iniciales y del tiempo de ejecución, podría ser conveniente
elegir un recinto aún mayor, con multiplicador superior a tres (se sugiere ocho). De no hacerlo
así podría suceder que el retorno debido al rebote de la ondas en los contornos del recinto
distorsionara las condiciones de contorno para el recinto pequeño, anulando así la hipótesis de
infinitud para el dominio.

MIM-UCM Página 15
El código fuente para esta aproximación se ha parametrizado para observar el comienzo del
rebote de retorno.

Como posible mejora se sugiere combinar la segunda aproximación con la tercera, ejecutando
ambas en paralelo, de modo que las condiciones de contorno para el recinto menor se
actualicen, en cada iteración, con los valores de función que en esas mismas celdillas almacena
el recinto mayor.

Autor: Alfonso de la Fuente Ruiz


http://www.linkedin.com/in/alfonsofr

MIM-UCM Página 16
BIBLIOGRAFÍA
Esta bibliografía incluye una serie de libros, artículos y otras referencias que se han
consultado para la realización del presente trabajo.

[1]: “Apuntes y guiones de prácticas de la asignatura MNMSD“ del Máster Oficial de


Postgrado en Ingeniería Matemática adaptado al Espacio Europeo de Educación Superior
(EEES/EHEA), Universidad Complutense de Madrid, curso 2006-2007.

*2+: “Numerical Methods for Problems with Moving Fronts” by Bruce A. Finlayson, University
of Washington. Ravenna Park Publishing Inc. (1992)

*3+: “Numerical Analysis. Mathematics of Scientific Computing” by David Kincaid and Ward
Cheney, University of Texas at Austin. Brooks/Cole (1991)

*4+: “A compendium of partial differential equation models: Method Of Lines analysis with
Matlab” by William E. Schiesser and Graham W. Griffiths. Cambridge University Press (2009)

*5+: “Computational Physics 430 (course)” by Ross Spencer and Michael Ware, Department of
Physics and Astronomy, Brigham Young University.
http://www.physics.byu.edu/Courses/Computational/phys430/phys430.pdf

[6]: “Tiny FDTD v1.0” by Nick Clark. MATLAB Central (7 Aug. 2008)
http://www.mathworks.com/matlabcentral/fileexchange/21000

*7+: “Web personal Ana Carpio: Laboratorio de Realidad Virtual – Ecuaciones de ondas
(Ejemplos VRML en Cortona3D)” por Ana Carpio Rodríguez y Guillermo Garrido Yuste, UCM-
UNED. http://www.mat.ucm.es/~acarpio/ondas.htm

*8+: “Notes on perfectly matched layers (PMLs)” by Steven G. Johnson. MIT (19 July 2008)
http://math.mit.edu/~stevenj/18.369/pml.pdf

*9+: “Electromagnetic simulation using the FDTD method” by Dennis M. Sullivan, University of
Idaho. IEEE press (2000)

[10]: “Finite Difference Methods for Differential Equations” by Randall J. LeVeque. 585 course
from the University of Washington (January 2006)
http://www.amath.washington.edu/~rjl/pubs/am58X/am585winter06.pdf

*11+: “UNIVERSIDAD AUTÓNOMA DE MADRID: Prácticas de Ecuaciones en Derivadas


Parciales y Análisis Numérico” de Pablo Angulo Ardoy y María López Fernández (UAM)
http://www.uam.es/personal_pdi/ciencias/pangulo/

MIM-UCM Página 17

También podría gustarte