Está en la página 1de 13

6.3.

Ejemplo: La ecuacin de Laplace

Flujo en estado estacionario de las aguas subterrneas en un isotrpica, de espesor constante homognea, acufero horizontal se rige por la ecuacin de Laplace [Cuadro 6.1]. La ecuacin, en trminos de la cabeza de las aguas subterrneas, h, es

Considere la ecuacin de Laplace aplicada a una seccin rectangular de acufero con las condiciones de contorno de Dirichlet (que slo significa que se especifican en las cabezas de los lmites). Deje que el acufero sea 400m de largo en la direccin x y 200 metros de largo en la direccin y. Aplicar una cuadrcula con Dx = Dy = 50m y 50m y el uso de i y j al ndice de la posicin en la cuadrcula superpuesta en el dominio. Las cabezas en el lmite se fijan a 100m a lo largo del lado derecho de la frontera y 0 en otro lugar (Figura 6.1).

La sustitucin de aproximaciones centro-a diferencia de los derivados en la ecuacin de Laplace para un nodo general (i, j) conduce a:

Deje Dd representan tanto Dx y Dy, que hemos especificado son iguales a 50m. La ecuacin (6.1) se puede escribir:

Figura 6.1 Malla para la Ecuacin de Laplace en Diferencias Finitas

Deje Dd representan tanto Dx y Dy, que hemos especificado son iguales a 50m. La ecuacin (6.1) se puede escribir:

Consideremos ahora la ecuacin para el nodo 1 de la Figura 6.1. Es claro que el problema que tenemos 21 incgnitas (7 nodos "i" Tiempos 3 nodos "j"). Tenemos varios de los nodos y usar

un nico subndice h para designar lo que desconoce que estamos considerando (Figura 6.1). La ecuacin (6.2) para el nodo 1 indica

Se puede escribir una ecuacin como esta para cada uno de los 21 nodos de obtener un sistema de 21 ecuaciones con 21 incgnitas. La primera de estas ecuaciones (para h1) muestra una -4 como el coeficiente de la primera desconocido y aquellos para la segunda y octava desconocido. Escribe la ecuacin para el segundo nodo. Su resultado debe mostrar un coeficiente de -4 para la segunda desconocido y los de la primera, tercera y novena. Si escribimos todas las ecuaciones y las ponemos en forma de matriz-vector, el resultado es un conjunto de ecuaciones lineales simultneas.

Resolver el problema de ejemplo en MATLAB.

Ya hemos visto cmo resolver sistemas de ecuaciones en MATLAB (Captulo 2.9). Todo lo que hay que hacer es especificar la matriz y el vector de la derecha. Una forma que de inmediato viene a la mente es la de escribir un archivo-m que recorre los elementos de la matriz 21x21. Ese archivo podra tener este aspecto. (Si usted no ha utilizado todas las operaciones lgicas MATLAB, "==" indica "igual a", "~ =" indica "no es igual a".)

A=zeros(21,21); %asignar espacio previo for the matrix for k=1:21 % 21 rows for n=1:21 % 21 columns A(k,n)=0; if k==n A(k,n)=-4;end if k==n-1 & n~=8 & n~=15 A(k,n)=1;end

if k==n+1 & k~=8 & k~=15 A(k,n)=1;end if k==n-7 A(k,n)=1;end if k==n+7 A(k,n)=1;end end end ;

El resultado en MATLAB es (para los primeros 9 filas y columnas)

A(1:9,1:9)

que es el resultado deseado .

Hay muy buenas razones para evitar este mtodo de " fuerza bruta " para la creacin de matrices de diferencias finitas . En primer lugar , MATLAB es muy eficaz en tratar con operaciones vectoriales y no muy eficiente en tratar con " los bucles " . (Si desea realizar clculos asa como las mostradas anteriormente, asegrese de asignar previamente un espacio para la matriz , es decir , para usar A = ceros ( 21,21 ) antes de comenzar el ciclo. ) Que es ms importante , las matrices pueden llegar a ser grandes con bastante rapidez. Por el simple ejemplo de arriba , tuvimos 21 incgnitas que conducen a una matriz con 21 filas y 21 columnas, designan una matriz 21x21 . En este caso, la matriz tiene 441 entradas . Pero si queremos reducir a la mitad el espaciado de la cuadrcula en el problema de ejemplo, podemos terminar con 15x7 = 105 incgnitas y nuestra matriz es 105x105 , y cuenta con 11.025 entradas. Y esto no es un gran problema en absoluto . Cmo nos recuperamos de la dificultad de trabajar con un gran nmero de entradas de la matriz ? Si nos fijamos en la

matriz para nuestro problema de ejemplo , tenemos una pista. La mayor parte de las entradas de la matriz son iguales a cero . Las matrices que se presentan en diferencias finitas (y de elementos finitos ) mtodos son escasos , tienen muchos elementos cero . Si somos capaces de aprovechar slo las entradas no nulas raleza y almacn, ahorrar enormemente. MATLAB hace a travs de una serie de comandos de matrices dispersas, como se indica continuacin1.

Vamos a utilizar los comandos de matrices dispersas para construir la matriz para el problema de ejemplo. En primer lugar queremos tener una matriz cuadrada 21x21 con valores de -4 en la diagonal principal (las entradas va desde la parte superior izquierda a la parte inferior derecha de la matriz).

M_diag=sparse(1:21,1:21,-4,21,21);
A continuacin construimos la subdiagonal, la lnea de las entradas directamente debajo de la diagonal principal .

L1_diag=sparse(2:21,1:20,1,21,21);
Finalmente, construimos la diagonal que es de 7 elementos abajo de la diagonal principal. Estas son las entradas que se derivan de la lnea de nodos por debajo del que se considera, por ejemplo, h8 se produce en la primera ecuacin (ecuacin 6.3 y la Figura 6.1).

L2_diag=sparse(8:21,1:14,1,21,21);
Tenga en cuenta que nosotros no tenemos que construir las diagonales sper, los que por encima de la diagonal principal, explcitamente --- no son ms que la transposicin de las subdiagonales. La matriz que queremos (en realidad, vamos a tener que hacer una pequea modificacin, vase ms adelante) es la suma de las matrices diagonales correspondientes.

A=M_diag+L1_diag+L2_diag+L1_diag'+L2_diag';
Qu tan grande es nuestra matriz dispersa?

size(A)
Cmo es la matriz quiero mirar?

A(1:9,1:2)

Usted ve que las nicas indicaciones que figuran no son cero. El comando de MATLAB "completo" puede ser utilizado para convertir una matriz dispersa a la forma regular.

full(A(1:9,1:9))

La matriz del todo bien sin embargo no lo es. La matriz debe ser "bloqueado" con los lmites de los "bloques" que se corresponden con los extremos de las filas de la grilla de diferencias finitas. (Figura 6.2 muestra que la matriz se compone de tres 7x7 "bloques" que son idnticos.) Los bloques surgen porque no hay "uno" en la posicin a la derecha del punto ms a la derecha en la primera fila (por ejemplo, variables 8 no aparecer en la ecuacin para el nodo 7). Del mismo modo, no hay un "uno" en la posicin a la izquierda de la posicin ms a la izquierda en una fila (por ejemplo, 14 variables no aparece en la ecuacin para el nodo 15). Por lo tanto, es necesario establecer varios elementos en nuestra matriz dispersa a cero.

A(7,8)=0;A(8,7)=0;A(14,15)=0;A(15,14)=0;
Podemos usar el comando "espa" MATLAB para ver la estructura de la matriz A grficamente (Figura 6.2).

spy(A)

El paso final, la solucin de las ecuaciones, se puede hacer utilizando mtodos presentados en el captulo 2. Por ejemplo, podemos definir el vector de la derecha utilizando cantidades conocidas (las cabezas de los lmites) y obtener la solucin fcilmente utilizando el comando MATLAB barra invertida.

b=zeros(21,1);b(7)=-100;b(14)=-100;b(21)=-100 ; h=A\b; output=[h(1:7) h(8:14) h(15:21)]

Es posible que desee preparar un archivo-m, la generalizacin de las declaraciones anteriores, para resolver el problema de la muestra para el usuario especificado espaciado de la cuadrcula y ver el efecto de la disminucin de espaciado de la cuadrcula de las respuestas.

6.4. Ejemplo de problema: El problema "Toth" Como ejemplo de cmo generalizar el planteamiento esbozado ms arriba, considere el archivo-m de abajo para resolver la ecuacin de Laplace para una de dos dimensiones, corte vertical de un acufero con un lmite superior especificado por ondulantes valores de la cabeza del agua subterrnea. Las ondulaciones son para representar los efectos de la topografa. Toth (1963) investig el problema en un artculo ya clsico. Las condiciones de contorno para los lados izquierdo y derecho y por la parte inferior del dominio no son fijos cabezas. Ms bien, se supone que no hay flujo a travs de estos lmites. En este caso, el derivado de h con respecto a la coordenada espacial es cero. Nosotros nos encargamos de la condicin mediante el uso de la aproximacin de diferencias centrales para el derivado en el nodo de frontera. Considere la aproximacin de un nodo frontera "i" en una cuadrcula (Figura 6.3).

La ecuacin (3.4), la aproximacin centro de diferencia de la primera derivada, se requieren valores de "i-1", as como en "i +1". Es decir,

En realidad, no tenemos un nodo en "i-1", pero se inserta un nodo ficticio slo para permitir que tratemos a la condicin de frontera. Para no hay flujo, el derivado anterior debe ser cero y esto implica que hi-1 debe ser igual a hi 1. En consecuencia, cuando hi-1 se produce en las ecuaciones en diferencias finitas, nos pusimos a hi 1. En efecto, esto significa que los coeficientes de la "hi +1' s" en el problema Toth debe estar ajustado a 2 en lugar de 1. (La

mejor manera para que usted pueda digerir esta es estudiar el cdigo y pensar en las condiciones de contorno adecuadas.)

% This is a finite-difference solution for Toth's problem. % Code by George Hornberger and Jeff Raffensperger % % First set the grid size.
% J=input('Number of nodes in the x direction? (Try 75 if in doubt.)')

K=input('Number of nodes in the y direction? (Try 25.) ') W=input('Number of hill-valley waves? (Try 3.) ') amp=input('Amplitude of hill-valley waves (0-10)? (Try 3.) ') % % The number of nodal points is J*K. % n=J*K; % % Finite-difference equations generate SPARSE matrices; % that is, most entries are zero. % MATLAB takes advantage of this sparsity by NOT storing the entire matrix. % % Set the coefficient matrix for the Laplace equation. % M_DIAG=sparse(1:n,1:n,-4,n,n); L1_DIAG=sparse(2:n,1:n-1,1,n,n); L2_DIAG=sparse(J+1:n,1:n-J,1,n,n); A=L2_DIAG+L1_DIAG+M_DIAG+L1_DIAG'+L2_DIAG';

% % Next set the vector of "knowns" and modify the coefficient matrix % to account for the boundary conditions. % The heads at the top are set to grade linearly from 20 to 0.2, % with W sine waves of amplitude A superimposed. % dh=20/J; hT=20:-dh:0.2; % for i=1:J
hT(i)=hT(i)+amp*sin(2.*pi*((i-1)/(J/W))); end

% % Let's look at the topography of the water table... % dJ=0:1:J-1; dK=0:1:K-1; figure(1) plot(dJ,hT) % % Next set the right-hand vector, adjust the coefficients on the no-flow boundaries, and fix the matrix entries at the edges of the "blocks". %

rhs=zeros(n,1); for j=1:J % Bottom and top boundaries

rhs((K-1)*J+j)=-hT(j); A(j,j+J)=2; end for k=1:K % Right-hand boundary

A(k*J,k*J-1)=2; end for j=1:J:K*J % Left-hand boundary

A(j,j+1)=2; if j>1 & j<K*J % Block the matrix A(j,j-1)=0; A(j-1,j)=0; end end % % The finite difference equations are in the form A*h=rhs, where % "A" is the coefficient matrix, "h" is the vector of unknown heads, % and "rhs" is the vector of known quantities. % % The MATLAB "\" function solves the system of equations.

% h=A\rhs; % % The unknown heads can be put back into the gridded form to view % in our x-y orientation. % hh=reshape(h,J,K); % % Add in the known heads along the top boundary and rotate the grid % into the upright position. % hh=[hh hT']; hh=hh'; % % Next we can contour the heads. figure(2) contour(hh,12) axis equal % % The MATLAB gradient function, allows us to calculate the flow % directions. %[ px,py]=gradient(hh);

% % We can plot the flow vectors on the contour plot. % (Note: the "1" in the "quiver" command regulates the size of the % arrows.) % hold on;quiver(-px,-py,1); hold off;