Está en la página 1de 7

MODELACI

´
ON MATEM
´
ATICA II
Licenciatura de Matem´aticas. Curso 2011-2012.
Pr´actica 1. Febrero 2012.
Simulaci´on de la ecuaci´on del calor y de la ecuaci´on de ondas
con diferencias finitas
1.1 Resolviendo la ecuaci´on del calor
Presentamos aqu´ı un c´odigo Matlab que resuelve la ecuaci´on del calor con
condiciones de contorno de tipo Dirichlet mediante aproximaciones num´ericas
del tipo “diferencias finitas”. Es f´acil generalizar este c´odigo as´ı como los que
dem´as que se presentan en este cap´ıtulo al caso de que las condiciones de con-
torno sean m´as generales. El problema que vamos a resolver es
u
t
−ku
xx
= 0 (1)
u(x
i
, t) = u
i
u(x
f
, t) = u
f
u(x, 0) = u
0
(x),
donde
u
0
(x) =







2(x −x
i
) , x
i
< x < x
i
+
x
f
−x
i
2
2(x
f
−x) , x
i
+
x
f
−x
i
2
< x < x
f
x
i
es el punto inicial del intervalo de resoluci´on de la ecuaci´on, x
f
es el punto
final. Denoratemos por n el n´ umero de puntos en que discretizamos el intervalo
en el espacio, m el n´ umero de pasos temporales, dt el paso de tiempo, k el
coeficiente de difusi´on, u
i
y u
d
los valores de u en los bordes izquierdo y derecho
respectivamente. El c´odigo es el siguiente:
*******************************************
function [u,x,t]=d finit(xi,xf,n,m,dt,k,ui,ud);
% Funci´on que resuelve mediante diferencias finitas la ecuaci´on (1)
% Variables, incognitas, pasos del mallado, constantes del sistema.
x=zeros(n+1);
u=zeros(n+1,m+1);
h=(xf-xi)/n;
x=xi:h:xf;
s=k*dt/hˆ2;
1
% Datos iniciales y condiciones de borde
n2=fix((n+1)/2);
for i=1:n2
u(i,1)=2*(x(i)-xi);
end
for i=n2+1:n+1
u(i,1)=2*(xf-x(i));
end
u(1,:)=ui;
u(n+1,:)=ud;
% Algoritmo
for j=1:m
for i=2:n
u(i,j+1)=u(i,j)+s*(u(i+1,j)+u(i-1,j)-2*u(i,j));
end
t(j)=(j-1)*dt;
end
t(m+1)=m*dt;
% Gr´afica
plot(x(1:n+1),u(1:n+1,m));
****************************************************
1.2 Estabilidad del m´etodo
Vamos a calcular la soluci´on con x
i
= 0, x
f
= 1, n = 100, m = 100,
dt = 0.0001, k = 1, u
i
= 0, u
d
= 0.
Para ello escribe:
d finit(0,1,100,100,0.0001,1,0,0);
Como podemos comprobar, el resultado es altamente oscilatorio y la tem-
peratura toma valores enormes, cosa que no es f´ısicamente razonable. El pro-
blema est´a en la elecci´on del paso temporal. Recordar que para que el esquema
num´erico sea estable se debe cumplir
s = k
dt
h
2
<
1
2
.
En el caso que acabamos de simular se tiene que
s = 1
0.0001
(0.01)
2
= 1.
2
Para hacerlo estable, reducimos el paso de tiempo dt = 0.000049. En este caso
resulta que
s = 0.49 <
1
2
y el esquema se ha hecho estable.
Investiguemos a continuaci´on c´omo se comporta la soluci´on a tiempos largos.
Hagamos m = 10000 y vemos el resultado.
Como se puede ver, la soluci´on converge a cero. La temperatura va de-
cayendo hasta hacerse igual a sus valores en la frontera.
1.3 Representando graficamente
A continuaci´on presentamos unas subrutinas para la representaci´on gr´afica
de los resultados num´ericos:
En primer lugar, vamos a ver como representar varias gr´aficas en una misma
figura. Tecleamos
subplot(1,2,1)
Con ello se genera el primero de una columna de dos dibujos. El primer par
de naturales nos indica las filas y las columnas que hacemos en nuestra figura.
Vamos a determinar los par´ametros que determinan los margenes del dibujo.
cfx=0.1;
cfu arriba=0.2;
cfu abajo=0.1;
Calculamos tambi´en algunas variables que nos permitir´an representar de
forma adecuada la funcion u.
lx=max(x)-min(x);
lu=max(max(u))-min(min(u));
Con estos par´ametros determinamos los segmentos del eje de abcisas y del
eje de coordenadas:
ejes=[min(x)-cfx*lx, max(x)+cfx*lx, min(min(u))-cfu abajo*lu, max((max(u))+cfu arriba*lu)];
Dibujamos para cada posicion x, el valor de u correspondiente (estos valores
han sido determinados antes, por ejemplo, con d finit)
plot(x,u(1:n+1,m+1));
Modificamos los ejes seg´ un las indicaciones previas
axis(ejes);
Ahora, generamos la segunda gr´afica de nuestra figura
subplot(1,2,2);
3
De la misma manera procedemos con el segundo de los dos dibujos de la fila,
representando el vector espacial x y la correspondiente u en un determinado
tiempo.
Ahora procedemos a realizar una animaci´on. Utilizando la funci´on d finit
determinamos la funci´on u para una serie de pasos de tiempo. Escribamos:
n=100;
m=100;
[u,x]=d finit(0,1,n,m,0.000049,0.5,0,0);
La animaci´on, en la cual se representa las x y las correspondientes u, durante
los m pasos de la discretizaci´on temporal la escribimos de la siguiente manera:
for j = 1:m+1
plot(x,u(1:n+1,j));
F(j) = getframe;
end
movie(F) % Funci´on que se encarga de hacer la pel´ıcula
A continuaci´on vamos a representar graficamente en 3 dimensiones la soluci´on
u en funci´on del espacio x y el tiempo t
figure(2); % hacemos una nueva figura sin perder la ventana anterior
Creamos una segunda lamina de dibujo para as´ı ver mejor la gr´afica.
[X,T]=meshgrid(x,t);
Almacena en X la primera coordenada de la malla de los valores de x y t; y
en T, la segunda coordenada
surf(X,T,u’);
Utilizamos la funcion surf para dibujar en 3 dimensiones. Para ello debemos
trasponer u.
1.4 Discretizando la ecuaci´on de ondas
Presentamos aqu´ı un c´odigo Matlab que resuelve la ecuaci´on del ondas con
condiciones de contorno de tipo Dirichlet mediante aproximaciones num´ericas
del tipo “diferencias finitas”. El problema que vamos a resolver es el siguiente
u
tt
−c
2
u
xx
= 0, x ∈ [0, 1] , t > 0,
u(0, t) = 0,
u(1, t) = 0,
u(x, 0) = f(x),
u
t
(x, 0) = g(x).
4
La versi´on discretizada de la ecuaci´on de ondas utilizando la aproximaci´on
centrada con tres valores es
u
(j+1)
i
+ u
(j−1)
i
−2u
(j)
i
(∆t)
2
−c
2
u
(j)
i+1
+ u
(j)
i−1
−2u
(j)
i
(∆x)
2
= 0
y de la condici´on inicial para u
t
aproximando la derivada de manera centrada:
u
(1)
i
−u
(−1)
i
2∆t
= g(x
i
).
Por tanto, para todo tiempo j ≥ 1
u
(j+1)
i
= −u
(j−1)
i
+ 2u
(j)
i
+ ν
2

u
(j)
i+1
+ u
(j)
i−1
−2u
(j)
i

,
con
ν =
c∆t
∆x
.
Pero para j = 0 debemos usar la condici´on inicial de u y la aproximaci´on de la
velocidad inicial u
t
para deducir
u
(−1)
i
= u
(1)
i
−2g(x
i
)∆t,
que sustituiremos en nuestro algoritmo
u
(1)
i
= −u
(−1)
i
+ 2u
(0)
i
+ ν
2

u
(0)
i+1
+ u
(0)
i−1
−2u
(0)
i

,
para que nos permita calcular el primer paso en tiempo como sigue apartir de
los datos iniciales:
u
(1)
i
= g(x
i
)∆t + u
(0)
i
+
1
2
ν
2

u
(0)
i+1
+ u
(0)
i−1
−2u
(0)
i

.
1.5 Programa para la ecuaci´on de ondas
Consideraremos resolver la ecuaci´on de ondas con los siguientes datos ini-
ciales
f(x) = sin(πx) + 0.5 sin(3πx),
g(x) = 0 .
Definimos una funci´on que resuelve la ecuaci´on de ondas para un intervalo
general [xi, xf] y para datos iniciales particulares. Los argumentos son:
n, el n´ umero de divisiones en x,
m el n´ umero de pasos temporales,
dt el paso de tiempo,
c la velocidad.
5
El c´odigo es el siguiente:
*******************************************
function U= onda(xi,xf,n,m,dt,c);
%%Resuelve u
tt
−c
2
u
xx
= 0 mediante un esquema explicito de segundo
%% orden
u=zeros(n+1,m+1);
h=(xf-xi)/n;
x=[xi:h:xf];
s=c*dt*dt/hˆ2
% Dato inicial
for i=1:n+1
f(i)=sin(pi*x(i))+0.5*sin(3*pi*x(i));
g(i)=0;
end
for i=1:n+1
u(i,1)=f(i);
v(i,1)=dt*g(i);
end
% Condiciones de borde
u(1,:)=0;
u(n+1,:)=0;
% Calculo del primer paso temporal
for i=2:n
u(i,2)=u(i,1)-v(i)+s*(u(i+1,1)+u(i-1,1)-2*u(i,1))/2;
end
% Iteracion para el resto de pasos temporales
for j=2:m
for i=2:n
u(i,j+1)=2*u(i,j)-u(i,j-1)+s*(u(i+1,j)+u(i-1,j)-2*u(i,j));
end
end
plot(x,u(:,m+1));
title(’Soluci´on a tiempo final de la ecuaci´on de ondas’);
axis([min(x) max(x) -1.5 1.5]);
xlabel(’x’,’Fontsize’,14); ylabel(’u(x,t)’,’Fontsize’,14);
drawnow;
U=u;
****************************************************
6
A continuaci´on pasamos a resolver nuestro problema. Escribimos en l´ınea
de comandos:
>> U=onda(0,1,100,1000,0.001,1);
4.3 Otro ejemplo para la ecuaci´on de ondas
Como un segundo ejemplo ilustrativo del comportamiento de las soluciones
planteamos un dato inicial en x ∈ [0, 1] consistente en dato inicial para u con-
sistente en una funci´on que vale 1 en el intervalo [0.4, 0.6] y 0 fuera.
Dividimos el intervalo espacial en 1000 puntos. Para estos nuevos datos ini-
ciales, modificamos nuestro programa para intruducir estos datos de la siguiente
manera
for i=1:n+1
f(i)=0;
g(i)=0;
end
for i=401:601
f(i)=1;
g(i)=0;
end
for i=1:n
u(i,1)=f(i);
v(i,1)=u(i,1);
end
y posteriormente ejecutamos en l´ınea de comandos
>> U=onda(0,1,1000,1000,0.001,1);
Observese la formaci´on y propagaci´on de ondas y su reflexi´on en las paredes.
****************************************************************
7