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.