Sei sulla pagina 1di 7

MODELACI

ON MATEM

ATICA II
Licenciatura de Matematicas. Curso 2011-2012.
Practica 1. Febrero 2012.
Simulacion de la ecuacion del calor y de la ecuacion de ondas
con diferencias nitas
1.1 Resolviendo la ecuacion del calor
Presentamos aqu un codigo Matlab que resuelve la ecuacion del calor con
condiciones de contorno de tipo Dirichlet mediante aproximaciones numericas
del tipo diferencias nitas. Es facil generalizar este codigo as como los que
demas que se presentan en este captulo al caso de que las condiciones de con-
torno sean mas 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 resolucion de la ecuacion, x
f
es el punto
nal. 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
coeciente de difusion, u
i
y u
d
los valores de u en los bordes izquierdo y derecho
respectivamente. El codigo es el siguiente:
*******************************************
function [u,x,t]=d nit(xi,xf,n,m,dt,k,ui,ud);
% Funcion que resuelve mediante diferencias nitas la ecuacion (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/h2;
1
% Datos iniciales y condiciones de borde
n2=x((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;
% Graca
plot(x(1:n+1),u(1:n+1,m));
****************************************************
1.2 Estabilidad del metodo
Vamos a calcular la solucion 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 nit(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 fsicamente razonable. El pro-
blema esta en la eleccion del paso temporal. Recordar que para que el esquema
numerico 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 continuacion como se comporta la solucion a tiempos largos.
Hagamos m = 10000 y vemos el resultado.
Como se puede ver, la solucion converge a cero. La temperatura va de-
cayendo hasta hacerse igual a sus valores en la frontera.
1.3 Representando gracamente
A continuacion presentamos unas subrutinas para la representacion graca
de los resultados numericos:
En primer lugar, vamos a ver como representar varias gracas en una misma
gura. 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 las y las columnas que hacemos en nuestra gura.
Vamos a determinar los parametros que determinan los margenes del dibujo.
cfx=0.1;
cfu arriba=0.2;
cfu abajo=0.1;
Calculamos tambien algunas variables que nos permitiran representar de
forma adecuada la funcion u.
lx=max(x)-min(x);
lu=max(max(u))-min(min(u));
Con estos parametros 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 nit)
plot(x,u(1:n+1,m+1));
Modicamos los ejes seg un las indicaciones previas
axis(ejes);
Ahora, generamos la segunda graca de nuestra gura
subplot(1,2,2);
3
De la misma manera procedemos con el segundo de los dos dibujos de la la,
representando el vector espacial x y la correspondiente u en un determinado
tiempo.
Ahora procedemos a realizar una animacion. Utilizando la funcion d nit
determinamos la funcion u para una serie de pasos de tiempo. Escribamos:
n=100;
m=100;
[u,x]=d nit(0,1,n,m,0.000049,0.5,0,0);
La animacion, en la cual se representa las x y las correspondientes u, durante
los m pasos de la discretizacion 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) % Funcion que se encarga de hacer la pelcula
A continuacion vamos a representar gracamente en 3 dimensiones la solucion
u en funcion del espacio x y el tiempo t
gure(2); % hacemos una nueva gura sin perder la ventana anterior
Creamos una segunda lamina de dibujo para as ver mejor la graca.
[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 ecuacion de ondas
Presentamos aqu un codigo Matlab que resuelve la ecuacion del ondas con
condiciones de contorno de tipo Dirichlet mediante aproximaciones numericas
del tipo diferencias nitas. 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 version discretizada de la ecuacion de ondas utilizando la aproximacion
centrada con tres valores es
u
(j+1)
i
+ u
(j1)
i
2u
(j)
i
(t)
2
c
2
u
(j)
i+1
+ u
(j)
i1
2u
(j)
i
(x)
2
= 0
y de la condicion inicial para u
t
aproximando la derivada de manera centrada:
u
(1)
i
u
(1)
i
2t
= g(x
i
).
Por tanto, para todo tiempo j 1
u
(j+1)
i
= u
(j1)
i
+ 2u
(j)
i
+
2

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

,
con
=
ct
x
.
Pero para j = 0 debemos usar la condicion inicial de u y la aproximacion 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)
i1
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

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

.
1.5 Programa para la ecuacion de ondas
Consideraremos resolver la ecuacion de ondas con los siguientes datos ini-
ciales
f(x) = sin(x) + 0.5 sin(3x),
g(x) = 0 .
Denimos una funcion que resuelve la ecuacion 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 codigo 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/h2
% 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(Solucion a tiempo nal de la ecuacion 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 continuacion pasamos a resolver nuestro problema. Escribimos en lnea
de comandos:
>> U=onda(0,1,100,1000,0.001,1);
4.3 Otro ejemplo para la ecuacion 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 funcion 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, modicamos 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 lnea de comandos
>> U=onda(0,1,1000,1000,0.001,1);
Observese la formacion y propagacion de ondas y su reexion en las paredes.
****************************************************************
7

Potrebbero piacerti anche