1 Diferencias finitas

Anuncio
PRÁCTICAS DE CÁLCULO NUMÉRICO III
PRÁCTICA 6: la ecuación de Laplace en un dominio rectangular mediante
diferencias finitas
En esta práctica resolveremos la ecuación de Laplace con condiciones de contorno de
tipo Dirichlet mediante diferencias finitas. Este es el problema correspondiente a la obtención de la distribución de temperaturas en una placa rectangular con unas distribución
fija de temperatura en los bordes de la placa.
Nuestro problema de prueba será:
y
φ(x)
1
ux x + uy y =0
u=0
0
u=0
ψ(y)
1
φ(x)
= 100sinh(pi/10)sin(pi x/10)/sinh(pi)
ψ(y)
= 100sin(pi/10)sinh(pi y/10)/sinh(pi)
x
cuya solución analı́tica es:
uan (x, y) =
1
100 sinh(πy/10) sin(πx/10)
sinh(π)
Diferencias finitas:
La aproximación de diferencias finitas (con un esquema de 5 puntos para el laplaciano) de
la ecuación de Poisson
∇2 u ≡ uxx + uyy = f (x, y)
(1)
responde, como sabemos, al siguiente método:
u(x + h, y) + u(x − h, y) + u(x, y + h) + u(x, y − h) − 4u(x, y) ≈ h2 f (x, y)
En esta expresión asumimos, por simplicidad, un mismo espaciado h en las dos direcciones. Tomaremos el origen de coordenadas en el vértice inferior izquierdo de la placa. En
esta práctica resolveremos la ecuación de Laplace tanto mediante esta regla de 5 puntos
como mediante la de 9 puntos.
Nuestra rutina de diferencias finitas (dfelip.m) tendrá la siguiente sintaxis:
function [x,y,u,lap]=dfelip(h,a,b,fx0,fxa,fy0,fyb)
Donde el significado de los inputs es el siguiente:
%
%
%
%
%
%
%
h:
a:
b:
fx0:
fxa:
fy0:
fyb:
espaciado del reticulo en cada una de las dos direcciones.
longitud de la placa en la direccion x
longitud de la placa en la direccion y
funcion correspondiente a la condicion de Dirichlet para x=0
Idem para x=a
Idem para y=0
Idem para y=b
y el significado de los outputs es:
%
%
%
%
x:
y:
u:
lap:
vector
vector
matriz
matriz
de coordenadas en la direccion x
de cordenadas en la direccion y
del campo de temperaturas en los puntos del reticulo
laplaciana obtenida
Damos el programa dfelip explı́citamente:
function [x,y,u,L]=dfelip(h,a,b,fx0,fxa,fy0,fyb,rule)
[x,y,u,IP,nv,in,jn,aa]=gridrD(h,a,b,fx0,fxa,fy0,fyb);
[L,B]=feval(rule,u,IP,nv,in,jn,aa);
v=L\B;
for a=1:nv
u(in(a),jn(a))=v(a);
end;
Vemos que el programa llama a dos funciones. La primera de ellas, gridrD.m, crea
los vectores x e y, inicializa la función solución considerando las condiciones de contorno
y hace los mismo con otras variables necesarias para la construcción del sistema lineal.
La segunda se utiliza para la construcción de la matriz laplaciana L y la de términos
independientes B; cuando rule=’lapla5’, la lı́nea
[L,B]=feval(rule,u,IP,nv,in,jn,aa);
es, por supesto, equivalente a
[L,B]=lapla5(u,IP,nv,in,jn,aa);
Describiremos más adelante en qué consiste la rutina lapla5.m. Antes, es necesario entender la utilidad de gridrD.m.
La rutina gridrD.m crea la matriz u(i, j), i = 1...nx, j = 1...ny que va a representar
a nuestro dominio rectangular y donde se almacenarán los valores de la solución numérica.
Inicializaremos la matriz u(i, j) rellenando todas sus posiciones con un valor numérico
(IP) que no se vaya a alcanzar en la frontera del dominio; por ejemplo IP=10000. A
continuación especificaremos las condiciones de contorno (Dirichlet) del problema fijando
los valores u(1, j), u(nx, j), u(i, 1), u(i, ny) (nx y ny el número en las direcciones x e y).
Con una la elección de IP conveniente, los valores asignados distinguirán a los puntos (i, j)
interiores de los que no lo son, pues sólo los interiores verificarán que u(i, j) =IP.
Como sabemos, la resolución mediante diferencias finitas desemboca en la resolución de
un sistema lineal en el que las incógnitas serán los valores numéricos de la solución, u(i, j),
en los puntos interiores. Parte de la dificultad en la implementación está en identificar los
nodos, y hacerlos corresponder con las incógnitas. Esta es la tarea esencial de gridrD.m.
Para aclarar ideas y simplificar la realización de la práctica, damos a continuación
la rutina gridDr.m de forma explı́cita. Los comentarios explican el significado de las
variables, y de los input y outputs:
function [x,y,u,IP,nv,in,jn,aa]=gridrD(h,a,b,fx0,fxa,fy0,fyb)
%---------------------------------------------------------------------------% Introducimos el simbolo de punto interior para el dominio:
% IP: Punto interior =10000
IP=10000;
%-----------------------------------% Parametros de nuestro problema
%-----------------------------------% Empezamos el calculo
% Creamos los vectores x e y (igualmente espaciados) en ambos casos
% Espaciado del grid
nx=floor(a/h); ny=floor(b/h);
x=linspace(0,a,nx);
y=linspace(0,b,ny);
% Vamos a definir ahora nuestro dominio mediante la matriz u
% Inicialmente ponemos todos los puntos como interiores
u([1:nx],[1:ny])=IP;
% Ahora especificamos las condiciones Dirichlet del problema:
u(:,ny)=feval(fyb,x)’;
u(nx,:)=feval(fxa,y);
u(1,:)=feval(fx0,y);
u(:,1)=feval(fy0,x)’;
len=nx*ny;
% ----------------------------------------------% Inicializacion de algunas variables y correspondencia
% entre punto del grid (i,j) y numeracion del nodo.
% -----------------------------------------------------in=zeros(len,1);
jn=zeros(len,1);
aa=zeros(nx,ny);
nv=0;
for i=1:nx
for j=1:ny
if u(i,j)==IP
%
nv es el numero de la incognita en el vector y del sistema linea L y=b
nv=nv+1;
%
ij(nv) da la coordenada x correspondiente a la incognita
in(nv)=i;
%
y jn(nv) da la y
jn(nv)=j;
%
la matriz aa identifica coordenadas (i,j) con el numero de incognita
aa(i,j)=nv;
end;
end;
end;
Una vez caracterizados los puntos del dominio y establecido la correspondencia entre
punto del grid (i, j) e incógnita, deberemos construir la matriz laplaciana L y el vector B
que contiene la información sobre la función f (x, y) y las condiciones de Dirichlet del problema. Esta tarea la realizarán las rutinas lapla5.m (laplaciano de 5 puntos) y lapla9.m
(laplaciano de 9 puntos). La resolución del sistema L v=B, nos proporcionara la solución
numérica del problema al identificar las incognitas en v con los valores numéricos u(i, j).
En lapla5.m (y en lapla9.m) inicializaremos la matriz laplaciana L como dispersa
(comando sparse(nv,nv)), siendo nv el número de nodos internos. Barreremos las filas
de la matriz L desde 1 hasta nv y asignaremos los elementos de la matriz laplaciana y
el vector B. El programa que realizará esta tarea sera lapla5.m para el laplaciano de 5
puntos; en este caso, para cada punto habrá que examinar el carácter de sus 4 puntos
vecinos, incluyendo su contribución a la matriz L cuando sean interiores o a la matriz
B cuando son frontera. Más adelante se utilizará también el laplaciano de 9 puntos,
que implementaremos en la rutina lapla9.m (en este caso habrá que examinar 8 puntos
vecinos).
Una vez creados L y B, resolveremos L v=B (para lo que utilizaremos el comando \
de MATLAB). El vector de valores v deberá traducirse a la matriz u(i,j) del campo de
temperaturas. Recordemos el programa dfelip:
function [x,y,u,L]=dfelip(h,a,b,fx0,fxa,fy0,fyb,rule)
[x,y,u,IP,nv,in,jn,aa]=gridrD(h,a,b,fx0,fxa,fy0,fyb);
[L,B]=feval(rule,u,IP,nv,in,jn,aa);
v=L\B;
for a=1:nv
u(in(a),jn(a))=v(a);
end;
En resumen, a las rutinas dfelip.m y gridrD.m, que se han proporcionado
de forma explı́cita, deberemos añadir las funciones lapla5.m y lapla9.m para
implementar los laplacianos de 5 y 9 puntos. También deberemos crear 4
funciones para cada una de las condiciones de contorno. LLamaremos a estos
ficheros fx0.m, fxa.m, fy0.m, fyb.m.
Además de estos programas, escribiremos un programa principal, prac6.m que contendrá las actividades que a continuación se describen.
En el programa prac6.m para representar la solución en el retı́culo y comparar con la
solución analı́tica debemos trasponer la matriz u, como veremos en el próximo ejemplo.
Vamos realizar los siguientes ejercicios con el laplaciano lapla5.m:
1. Representar gráficamente, en distintas gráficas tridimensionales, la solución aproximada uh para h = 0.1 y la solución analı́tica. Para ilustrar la realización de estas
gráficas, damos este ejemplo explı́citamente:
h=0.1;a=1;b=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[x,y,u,lap]=dfelip(h,a,b,’fx0’,’fxa’,’fy0’,’fyb’,’lapla5’);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definimos el mesh que utilizaremos para construir la
% solucion analitica y nuestras representaciones graficas:
[X,Y]=meshgrid(x,y);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Debemos trasponer u para que sea la u del grid
ugrid=u’;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(1);
mesh(X,Y,ugrid);
title(’Sol. aproximada por DFs’);
xlabel(’x’); ylabel(’y’); zlabel(’Temperatura’);
figure(2);
% Solucion analitica
sol=100.*sinh(pi/10.*Y).*sin(pi/10.*X)./sinh(pi);
mesh(X,Y,sol);
title(’Sol exacta’);
xlabel(’x’); ylabel(’y’); zlabel(’Temperatura’);
2. El error kuan − uh k cometido (para h = 0.1), siendo uan la solución analı́tica y uh
es la solución numérica con paso h. De nuevo, se deberá utilizar el comando mesh.
3. En una misma ventana gráfica (utilizando subplot):
(a) Los puntos del grid.
(b) La estructura de la matriz lap (utilizar el comando spy).
(c) La distribución de temperaturas aproximada en la placa rectangular. Haremos
un gráfico de contornos con relleno de color (usaremos contourf(X,Y,ugrid,20)).
(d) La distribución de temperaturas exacta en la placa rectangular.
4. Considerar hm = 0.25/2m , m = 1, ..., 6 y representar en una misma gráfica, en
función de m:
(a) El error máximo e(m) = maxi,j kuan (xi , yj ) − uh (xi , yj )k, m = 1, ...6.
(b) La estimación de la constante asintótica de error como función de m para cada
método, es decir, c(m) = kuan − uhm k/h2 , m = 1, ...6 para el laplaciano de 5
puntos.
e(m)
/ log(2), m =
(c) La estimación del orden de convergencia o(m) = log
e(m + 1)
1, ...5
(d) El tiempo de CPU empleado en cada caso.
Los apartados 2 y 4 anteriores habrán de repetirse para el laplaciano de 9 puntos,
teniendo en cuenta que la constante asintótica de error hay que estimarla en este caso
mediante c(m) = kuan − uhm k/h2 , m = 1, ...6.
Descargar