Ejemplo Ecuación Laplace Matlab
Short Description
Download Ejemplo Ecuación Laplace Matlab...
Description
6.3. Ejemplo: La ecuación de Laplace
Flujo en estado estacionario de las aguas subterráneas en un isotrópica, de espesor constante homogénea, acuífero horizontal se rige por la ecuación de Laplace [Cuadro 6.1]. La ecuación, en términos de la cabeza de las aguas subterráneas, h, es
Considere la ecuación de Laplace aplicada a una sección rectangular de acuífero con las condiciones de contorno de Dirichlet (que sólo significa que se especifican en las cabezas de los límites). Deje que el acuífero sea 400m de largo en la dirección x y 200 metros de largo en la dirección y. Aplicar una cuadrícula con Dx = Dy = 50m y 50m y el uso de i y j al índice de la posición en la cuadrícula superpuesta en el dominio. Las cabezas en el límite se fijan a 100m a lo largo del lado derecho de la frontera y 0 en otro lugar (Figura 6.1).
La sustitución de aproximaciones centro-a diferencia de los derivados en la ecuación 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 ecuación (6.1) se puede escribir:
Figura 6.1 Malla para la Ecuación de Laplace en Diferencias Finitas
Deje Dd representan tanto Dx y Dy, que hemos especificado son iguales a 50m. La ecuación (6.1) se puede escribir:
Consideremos ahora la ecuación para el nodo 1 de la Figura 6.1. Es claro que el problema que tenemos 21 incógnitas (7 nodos "i" Tiempos 3 nodos "j"). Tenemos varios de los nodos y usar
un único subíndice h para designar lo que desconoce que estamos considerando (Figura 6.1). La ecuación (6.2) para el nodo 1 indica
Se puede escribir una ecuación como esta para cada uno de los 21 nodos de obtener un sistema de 21 ecuaciones con 21 incógnitas. 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 ecuación 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 simultáneas.
Resolver el problema de ejemplo en MATLAB.
Ya hemos visto cómo resolver sistemas de ecuaciones en MATLAB (Capítulo 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 podría tener este aspecto. (Si usted no ha utilizado todas las operaciones lógicas 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 método de " fuerza bruta " para la creación 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 cálculos asa como las mostradas anteriormente, asegúrese de asignar previamente un espacio para la matriz , es decir , para usar A = ceros ( 21,21 ) antes de comenzar el ciclo. ) Que es más importante , las matrices pueden llegar a ser grandes con bastante rapidez. Por el simple ejemplo de arriba , tuvimos 21 incógnitas 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 cuadrícula en el problema de ejemplo, podemos terminar con 15x7 = 105 incógnitas y nuestra matriz es 105x105 , y cuenta con 11.025 entradas. Y esto no es un gran problema en absoluto . ¿Cómo nos recuperamos de la dificultad de trabajar con un gran número 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 ) métodos son escasos , tienen muchos elementos cero . Si somos capaces de aprovechar sólo las entradas no nulas raleza y almacén, ahorrar enormemente. MATLAB hace a través de una serie de comandos de matrices dispersas, como se indica continuación1.
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 continuación construimos la subdiagonal, la línea 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 línea de nodos por debajo del que se considera, por ejemplo, h8 se produce en la primera ecuación (ecuación 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 súper, los que por encima de la diagonal principal, explícitamente --- no son más que la transposición de las subdiagonales. La matriz que queremos (en realidad, vamos a tener que hacer una pequeña modificación, véase más 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) ¿Cómo 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 límites 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 idénticos.) Los bloques surgen porque no hay "uno" en la posición a la derecha del punto más a la derecha en la primera fila (por ejemplo, variables 8 no aparecerá en la ecuación para el nodo 7). Del mismo modo, no hay un "uno" en la posición a la izquierda de la posición más a la izquierda en una fila (por ejemplo, 14 variables no aparece en la ecuación 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 "espía" MATLAB para ver la estructura de la matriz A gráficamente (Figura 6.2).
spy(A)
El paso final, la solución de las ecuaciones, se puede hacer utilizando métodos presentados en el capítulo 2. Por ejemplo, podemos definir el vector de la derecha utilizando cantidades conocidas (las cabezas de los límites) y obtener la solución fácilmente 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 generalización de las declaraciones anteriores, para resolver el problema de la muestra para el usuario especificado espaciado de la cuadrícula y ver el efecto de la disminución de espaciado de la cuadrícula de las respuestas.
6.4. Ejemplo de problema: El problema "Toth" Como ejemplo de cómo generalizar el planteamiento esbozado más arriba, considere el archivo-m de abajo para resolver la ecuación de Laplace para una de dos dimensiones, corte vertical de un acuífero con un límite superior especificado por ondulantes valores de la cabeza del agua subterránea. Las ondulaciones son para representar los efectos de la topografía. Toth (1963) investigó el problema en un artículo ya clásico. Las condiciones de contorno para los lados izquierdo y derecho y por la parte inferior del dominio no son fijos cabezas. Más bien, se supone que no hay flujo a través de estos límites. En este caso, el derivado de h con respecto a la coordenada espacial es cero. Nosotros nos encargamos de la condición mediante el uso de la aproximación de diferencias centrales para el derivado en el nodo de frontera. Considere la aproximación de un nodo frontera "i" en una cuadrícula (Figura 6.3).
La ecuación (3.4), la aproximación 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 sólo para permitir que tratemos a la condición 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 código 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
View more...
Comments